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

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

程序的部分输出如下


9995   15824

9996   15824

9997   15824

9998   15824

9999   15824

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


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


0   11776

1   5424

2   10984

3   15848

4   11000

5   16728

6   4480

7   12016


8   12936

Python

python-多处理


慕妹3146593
浏览 145回答 2
2回答

江户川乱折腾

这对我来说看起来是预期的行为。根据参考文档here,函数Pool.map()将可迭代对象分割成多个块,将它们作为单独的任务提交给进程池。这些块的(近似)大小可以通过将 chunksize 设置为正整数来指定。这显然允许选项send_request为同一进程使用不同的参数多次调用。通过chunksize=1应该可以解决这个问题。

潇湘沐

你会在这里找到一个等效的问题简而言之,多处理是一组多个输入参数,出于性能原因task,这些参数一起发送(按大小批量发送)。chunksize因此,worker 最多将执行maxtaskperchild * chunksize函数调用。可以在pool.map调用中指定块大小:pool.map(send_request, range(1000), chunksize=1)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python