如果要启动大量子进程, 可以用进程池的方式批量创建子进程.
Pool
使用类Pool
可以创建进程池, 然后把各种数据处理任务都提交给进程池.
Pool([numprocess, initializer, initargs])
说明:
numprocess
是指要创建的线程数. 默认是cpu的核心数.(os.cpu_count()
的返回值)initializer
是每个进程启动时要执行的可调用对象, 默认是None
initargs
是传递给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("主进程执行完毕")