多线程,多进程(2)

1.多线程等待

import threading,time

def run():

         # time.sleep(3)

         print('哈哈哈')

start_time = time.time()

threads = []  #存放启动的5个线程

for i in range(5):

         t = threading.Thread(target=run)  #五个线程每个都不一样,分别独立

         t.start()#

         threads.append(t)

for lyl in threads:  #主线程循环等待5个子线程执行结束

         lyl.join()      #主线程依次等待子线程,join()就是等待方法。

end_time = time.time()

print('run_time..',end_time-start_time)

#######

主线程: 默认有个主线程

子线程:主线程启动子线程

问题??  如果这个函数里面有返回值的话,怎么获取呢?

   子线程运行的函数,如果里面有返回值的话,是不能获取到的     只能在外面定义一个list或者字典来存每次处理的结果。

通常情况下 电脑CPU有几核,那么只能同时运行几个线程。但是呢,python的多线程,只能利用一个CPU的核心。(这个是py设计时的缺点)

2.线程锁

 GIL  称为 全局解释器锁。

锁呢就是,在多个线程同时修改一个数据的时候,可能会把数据覆盖,在python2里面需要加锁。

 python3里面不加锁也无所谓,默认会自动帮你加锁

import threading,time

num = 1

lock = threading.Lock()  #申请一把锁

def run():

         time.sleep(1)

         global num

         lock.acquire() #加锁  acquire()

         num+=1

         lock.release() #解锁  release()

ts = []

for i in range(100):

         t = threading.Thread(target=run)

         t.start()

         ts.append(t)

[t.join() for t in ts]   #使用列表生成式进行等待

print(num)

3.守护线程

只要主线结束,那么子线程立即结束,不管子线程有没有运行完成

import threading,time

 def run():

         time.sleep(3)

         print('哈哈哈')

for i in range(50):

         t = threading.Thread(target=run)

         t.setDaemon(True) #把子线程设置成为守护线程   t.setDaemon(True)

         t.start()

print('Done,运行完成。')

time.sleep(3) #如果不等待就直接Done,运行完成后就完了

4.多进程

import multiprocessing,threading    #导入多进程模块

def my():

         print('哈哈哈') 

def run(num):

         for i in range(num):

                   t = threading.Thread(target=my)

                   t.start()

if __name__ == '__main__':                  #启动多进程必须加这个,模块要求

         for i in range(5):

                   p = multiprocessing.Process(target=run,args=(6,))  #启动一个进程,进程中添加线程(这里通过run函数调用多线程)对于run中参数有args给出,但是当有一个参数的时候

格式一定要加,号,比如args=(6,)。这句会执行5个进程,每个进程会有6个线程。

                   p.start()

5.关于多进程和多线程的选择??

多进程

           多用于处理CPU密集型任务,比如需要计算能力

多线程

            多用于IO密集型任务   不需要占用cpu,只是简单需要安排调度一下就可。

            Input Ouput

原文地址:https://www.cnblogs.com/cslw5566/p/9107973.html