1. 进程池
1.1 进程池串行-apply
apply从进程池里取进程,然后一个一个执行,第一个进程执行完,第二个进程才执行,进程之间是串行的操作。这样就不是并发操作,没有太大意义。
from multiprocessing import Pool
def f1(arg):
print(arg)
if __name__ == "__main__":
pool = Pool(5)
for i in range(10):
pool.apply(func=f1,args=(i,)) # apply执行函数,传入参数
print('end')
''' 打印: 0 1 2 3 4 5 6 7 8 9 end '''
1.2 进程池异步-apply_rsync
from multiprocessing import Pool
def f1(arg):
print(arg)
if __name__ == "__main__":
pool = Pool(5)
for i in range(10):
# pool.apply(func=f1,args=(i,)) # apply执行函数,传入参数
pool.apply_async(func=f1,args=(i,))
print('end')
''' 打印: end '''
这10个任务kua一下全执行了,主进程执行到end了。
主进程执行完了,子进程就被终止掉了。
主进程执行完了,就不再等子线程了,如果要等就要设置参数。
多线程线程默认也是,主进程不等子进程,多线程是:daemon=True加join来让他等。
join是终止进程,必须要前面执行close或者terminate方法。
执行close,等所有任务(10个)全部执行完,再终止
执行terminate,表示立即终止,不管你当前的任务是否执行完,都立即终止。
from multiprocessing import Pool
import time
def f1(arg):
time.sleep(1) # 加这句是为了看出5个5个执行的效果。
print(arg)
if __name__ == "__main__":
pool = Pool(5)
for i in range(10):
# pool.apply(func=f1,args=(i,)) # apply执行函数,传入参数
pool.apply_async(func=f1,args=(i,))
pool.close()
pool.join() # join表示:主进程执行到这里的时候,夯住了,等子进程结束的时候,再往下执行。
print('end')
光执行join,会触发下面的断言错误:
assert self._state in (CLOSE, TERMINATE)
join源代码有这句,只有符合这个条件的,才不会报错。
这个条件就是:执行join之前,必须执行close或者terminate方法。
close+join:是等子线程全部执行完了,才继续往下执行。