手动添加进程比较繁琐,可以使用进程池。
创建进程池:构造方法进程数,与参数--建进程 构造方法指定入口函数,与参数--取进程 进程池方法: close:关闭进程池,关闭后无法取进程。报错:ValueError: Pool not running。此时进程池中的进程仍在运行。 terminate:关闭进程池中所有进程 join:使主进程等待子进程执行完后再运行以后代码。否则,子进程未结束而主进程已结束,子进程内容无法输出。必须有 异步取进程:apply_async 同步取进程:等待第一个进程完成再取下一个进程,因此会阻塞 【1】:当取的进程数大于进程池创建时制定的进程数时, 会有指定的进程数个进程运行,其他后来的进程陷入等待,但不会阻塞主进程的运行
from multiprocessing import Pool
import multiprocessing
import os, time
def pro_funa(p):
# if p < 3:
# time.sleep(1)
# # 当前进程
# multiprocessing.current_process().join()
# multiprocessing.current_process().start()
print(p)
print('子进程1--->', os.getpid())
print('+++++++++++++++++++++++++++++\n')
time.sleep(1)
def pro_funb(p):
print('子进程2--->', os.getpid())
print('-----------------------\n')
def main():
"""主进程入口函数"""
# 穿件进程吃
poola = Pool(2)
# 取进程
# proa = poola.apply_async(pro_funa)
# print(proa, type(proa))
# prob = poola.apply_async(pro_funb)
# prob = poola.apply_async(pro_funa)
# for循环异步取进程【1】
la = [pro_funa, pro_funb]
for i in range(10):
# 不同入口函数
# poola.apply_async(la[i%2], args=(i,))
# 相同入口函数
poola.apply_async(pro_funa, args=(i,))
# 关闭进程池
poola.close()
# proa = poola.apply_async(pro_funa)
# 关闭进程池中所有进程
poola.terminate()
# 主进程阻塞
poola.join()
print('finish')
if __name__ == '__main__':
main()