为了账号安全,请及时绑定邮箱和手机立即绑定

为什么输出显示一个进程执行了多个任务

为什么输出显示一个进程执行了多个任务

慕妹3146593 2022-05-24 16:21:34
import multiprocessingdef send_request(data):    lock.acquire()    print(data,' ',os.getpid())    lock.release()def init(l):    global lock    lock = lif __name__ == '__main__':    data_list = ['data1', 'data2', 'data3']    lock = multiprocessing.Lock()    pool = multiprocessing.Pool(8, initializer=init, initargs=(lock,),maxtasksperchild=1)    pool.map(send_request, range(10000))    pool.close()    pool.join()程序的部分输出如下9995   158249996   158249997   158249998   158249999   15824根据maxtasksperchild的设置,应该是每个进程只执行一个任务,为什么输出显示一个进程执行了多个任务。但是,当我将语句从 更改为 时pool.map(send_request, range(10000)),pool.map(send_request, range(9))输出显示 maxtasksperchild 设置正常。0   117761   54242   109843   158484   110005   167286   44807   120168   12936Pythonpython-多处理
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

这对我来说看起来是预期的行为。根据参考文档here,函数Pool.map()

将可迭代对象分割成多个块,将它们作为单独的任务提交给进程池。这些块的(近似)大小可以通过将 chunksize 设置为正整数来指定。

这显然允许选项send_request为同一进程使用不同的参数多次调用。通过chunksize=1应该可以解决这个问题。


查看完整回答
反对 回复 2022-05-24
?
潇湘沐

TA贡献1816条经验 获得超6个赞

你会在这里找到一个等效的问题

简而言之,多处理是一组多个输入参数,出于性能原因task,这些参数一起发送(按大小批量发送)。chunksize因此,worker 最多将执行maxtaskperchild * chunksize函数调用。

可以在pool.map调用中指定块大小:

pool.map(send_request, range(1000), chunksize=1)


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号