首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么输出显示一个进程执行了多个任务

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

Stack Overflow用户
提问于 2019-09-10 20:21:40
回答 2查看 47关注 0票数 4
代码语言:javascript
复制
import multiprocessing
def send_request(data):


    lock.acquire()
    print(data,' ',os.getpid())
    lock.release()

def init(l):
    global lock
    lock = l

if __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()

程序的部分输出如下所示

代码语言:javascript
复制
9995   15824
9996   15824
9997   15824
9998   15824
9999   15824

根据maxtasksperchild的设置,应该是每个进程只执行一个任务,为什么输出显示一个进程执行了多个任务。

但是,当我将语句从pool.map(send_request, range(10000))更改为pool.map(send_request, range(9))时,输出显示maxtasksperchild设置是正常的。

代码语言:javascript
复制
0   11776
1   5424
2   10984
3   15848
4   11000
5   16728
6   4480
7   12016

8   12936
EN

回答 2

Stack Overflow用户

发布于 2019-09-10 20:41:52

你会发现一个等价的问题here

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

块大小可以在pool.map调用中使用以下命令指定:

代码语言:javascript
复制
pool.map(send_request, range(1000), chunksize=1)
票数 2
EN

Stack Overflow用户

发布于 2019-09-10 20:42:20

在我看来,这是意料之中的行为。根据参考文档here,function Pool.map()

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57870699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档