如果要启动大量子进程, 可以用进程池的方式批量创建子进程.
Pool
使用类Pool可以创建进程池, 然后把各种数据处理任务都提交给进程池.
Pool([numprocess, initializer, initargs])
说明:
numprocess是指要创建的线程数. 默认是cpu的核心数.(os.cpu_count()的返回值)initializer是每个进程启动时要执行的可调用对象, 默认是Noneinitargs是传递给initializer的元组参数.
from multiprocessing import Pool
def foo(name):
print("foo", name)
if __name__ == "__main__":
p = Pool(3, foo, ("李四",)) # 创建进程池, 进程池中有三个进程

进程池对象的一些方法
1. p.apply(func[, args])
在进程池的一个工作进程中执行func函数, args是传给func的元组参数. 注意使用这个方法让多个进程去执行, 他们是同步执行的. 即:多个进程是顺序执行的.
func的返回值就是p.apply的返回值.
from multiprocessing import Pool
def foo1(num):
return num ** 2
if __name__ == "__main__":
p = Pool(3) # 创建进程池, 进程池中有三个进程
for x in range(3):
r = p.apply(foo1, (x,))
print(r)

2. p.apply_aync(func[, args, kwargs, callback])
异步的执行func
callback 是可调用对象, 当func执行结束, 则立即调用callback并把func的返回值传递给callback.
from multiprocessing import Pool
import time
def foo1(num):
print("foo1", num)
time.sleep(2)
return num ** 2
if __name__ == "__main__":
p = Pool(3) # 创建进程池, 进程池中有三个进程
for x in range(5):
p.apply_async(foo1, (x,))
p.close()
print("等待子进程结束...")
p.join()
print("子进程执行完毕")
print("主进程执行完毕")

3. p.close()
关闭进程池, 防止进一步提交任务.
4. p.join()
等待所有工作进程退出. 此方法只能在close()和terminate()方法之后调用.
5. p.terminate()
立即停止所有的进程, 同时不进行清理和结束已经挂起的动作.
AsyncResult对象(apply_async()的返回值)
apply_async()的返回值是AsyncResult实例. 具有如下方法:
1. a.get([timeout])
等待返回结果, 结果就是任务函数的返回值.
2. a.ready()
如果任务函数执行结束返回True
3. a.successful()
如果任务函数执行结束, 且在执行的过程中没有发生异常则
4. a.wait([timeout])
等待任务结束, 这个方法与get()的区别就是它没有返回值.
from multiprocessing import Pool
import time
def foo1(num):
print("foo1", num)
time.sleep(2)
return num ** 2
if __name__ == "__main__":
p = Pool(3) # 创建进程池, 进程池中有三个进程
for x in range(5):
a = p.apply_async(foo1, (x,))
print(a.get(), a.successful())
p.close()
print("等待子进程结束...")
p.join()
print("子进程执行完毕")
print("主进程执行完毕")
