fork()生成进程只适用于liunx系统,要想跨平台使用多进程需要导入multiprocessing模块。
和fork产生的进程不同,利用Process产生的进程,主进程会等待子进程执行完毕。
也可利用子类来创建进程,自定义类继承Process,重写run()方法,当进程start()时会自动调用run方法。
每个进程都有独立的系统资源,各进程间的变量不共享互不影响。
join()方法可以等待子进程结束后才继续往下走,用于进程间的同步。
1 from multiprocessing import Process 2 import time 3 def test(): 4 while True: 5 print('test') 6 time.sleep(1) 7 8 p = Process(target=test) 9 p.start() 10 11 while True: 12 print('main') 13 time.sleep(1)
Process的参数有:
- target
所调用的对象 - args
调用函数对象的元组参数 - kwargs
调用函数对象的关键字参数字典 - name
进程实例的别名
Process常用属性,方法
- is_alive()
进程是否还在执行 - join([timeout])
等待进程结束,或等待多少秒 - start()
- run()
没有给定target,执行对象中的run()方法 - terminate()
立即终止 - name
- pid
进程池Pool
用于创建多个进程
3 from multiprocessing import Pool 4 import time 5 import os 6 7 def worker(num): 8 time.sleep(1) 9 print('工人 = %d,任务 = %d '%(os.getpid(),num)) 10 11 pa = Pool(3) 12 for i in range(10): 13 print(i) 14 pa.apply_async(worker,(i,)) 15 print('start') 16 pa.close() 17 pa.join() 18 print('end ')
multiprocess.Pool常用函数
- apply_async(func,args,kwds)
使用阻塞方式调用func - close()
关闭Pool,不能继续添加新任务 - terminate()
- join(): 主进程阻塞,等待子进程结束,必须在close或terminate之后使用
主进程不等待子进程