python多进程阻塞和非阻塞
非阻塞: (不需要等待)。
简单来说就是开启几个进程就同时运行几个进程。
比如下面程序,开启3个进程,那么程序一运行的时候立马执行3个进程同时调用function方法,不需要等待进程1执行完在执行进程2。
from multiprocessing import Lock, Pool
import time
def function(index):
print('Start process: ', index)
time.sleep(2)
print('End process', index)
if __name__ == '__main__':
pool = Pool(processes=3)
for i in range(4):
pool.apply_async(function, (i,)) #非阻塞
print("Started processes")
pool.close() #需要关闭进程池,防止池其他任务的提交,注意!这里不是关闭进程。简单来说就是关掉了屋外的大门,但是各个房间在运行。
pool.join() #等待进程池里面的进程运行完
print("Subprocess done.")
阻塞:(需要等待)。
简单来说就是需要等待进程1结束之后才能运行进程2。
就算同时开启3个进程,那么也得等待一个进程结束后才能运行下一个。
from multiprocessing import Lock, Pool
import time
def function(index):
print('Start process: ', index)
time.sleep(2)
print('End process', index)
if __name__ == '__main__':
pool = Pool(processes=3)
for i in range(4):
pool.apply(function, (i,)) #阻塞
print("Started processes")
pool.close()
pool.join()
print("Subprocess done.")
非阻塞优缺点
优点:快速运行,不受限制。追求程序运行时速度快,对结果返回的快慢不影响的可以使用这种
缺点:输出的结果可能杂乱,但子进程一定是运行完后才执行父进程,join()方法
下面是运行结果:
阻塞的优缺点:
优点: 输出结果顺序合理,相当于加上了锁和释放锁。对输出结果比较看重的可以使用阻塞。
缺点: 运行速度相对慢了点,毕竟要等待一个进程结束后才运行下一个进程
下面是运行结果