multiprocessing.pool的apply_async()多个任务不执行?

新手上路,请多包涵

问题描述

我要爬百度里的一些图片,因此这里使用multiprocessing.pool进程池,当我调用多个apply_async()时却发现,进程池里的任务都没执行

问题出现的环境背景及自己尝试过哪些方法

假设定义进程池
def f(args, *kwargs):

import os,time
print("pid:%d, now wait 5S...\n" % os.getpid())
time.sleep(5)
print("pid:%d, wait end...\n" % os.getpid())

pool = multiprocessing.Pool(3)
a = pool.apply_async(f)
b = pool.apply_async(f) <- 这里连续调用4个apply_async()
c = pool.apply_async(f)
d = pool.apply_async(f)
pool.close()
pool.join()
程序是执行的,能够显示4个任务,如果我连续调用6次apply_async()却发现任务都没有执行,我不知道为什么会这样。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
from multiprocessing import Process, Pipe

def f(args, *kwargs):

import os,time
print("pid:%d, now wait 5S...\n" % os.getpid())
time.sleep(5)
print("pid:%d, wait end...\n" % os.getpid())

if name == '__main__':

from multiprocessing import Pool

pool = Pool(3)
# pool.map(f, list(range(10)))

a = pool.apply_async(f)
b = pool.apply_async(f)
c = pool.apply_async(f)
d = pool.apply_async(f)
e = pool.apply_async(f)
f = pool.apply_async(f)
print('adding 6 task to pool...')
pool.close()
pool.join()   

运行程序,很快就结束。而6个任务没有执行。。。。。不懂为啥。

你期待的结果是什么?实际看到的错误信息又是什么?

这个apply_async怎么用?难道进程池不能使用apply_async多个任务?但我看了pool的源码,它可是有任务队列暂存任务的啊。

阅读 12.1k
1 个回答

如果没有要传的参数就这么定义:
def f():

否则apply_async中也要传递f的参数。定义和使用时要一致

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题