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发布于 2019-09-10 20:41:52
你会发现一个等价的问题here
简而言之,多处理task是一组多个输入参数,出于性能原因一起发送(以chunksize大小的批处理)。因此,worker最多只能执行大多数maxtaskperchild * chunksize函数调用。
块大小可以在pool.map调用中使用以下命令指定:
pool.map(send_request, range(1000), chunksize=1)发布于 2019-09-10 20:42:20
在我看来,这是意料之中的行为。根据参考文档here,function Pool.map()
将迭代器分成许多块,并将这些块作为单独的任务提交给进程池。这些块的(近似)大小可以通过将chunksize设置为正整数来指定。
这显然允许对同一进程使用不同的参数多次调用send_request。传递chunksize=1应该可以解决这个问题。
https://stackoverflow.com/questions/57870699
复制相似问题