【发布时间】:2019-12-10 08:05:50
【问题描述】:
我有一个请求服务器、检索一些数据、处理它并保存一个 csv 文件的函数。此功能应启动 20k 次。每次执行的持续时间都不同:有时会持续超过 20 分钟,有时会持续不到一秒。我决定使用multiprocessing.Pool.map 来并行执行。我的代码如下:
def get_data_and_process_it(filename):
print('getting', filename)
...
print(filename, 'has been process')
with Pool(8) as p:
p.map(get_data_and_process_it, long_list_of_filenames)
看看prints 是如何生成的,似乎long_list_of_filenames 被分成8 个部分并分配给每个CPU,因为有时只是在一个20 分钟的执行中被阻塞,而long_list_of_filenames 没有其他元素在这 20 分钟内处理完毕。我所期待的是map 以 FIFO 样式调度 CPU 内核中的每个元素。
我的情况有更好的方法吗?
【问题讨论】:
-
在这种情况下,您应该将
Pool.map()的chunksize参数设置为1。您可以从我的回答 here 中使用calc_chunksize_info()计算否则生成的块大小。 -
map的工作方式类似于内置的map用于迭代。这意味着订单是确保。换句话说,一个缓慢的进程会阻塞更快的进程。如果订单对您来说不重要,我建议改为查看map_async。
标签: python parallel-processing multiprocessing python-multiprocessing process-pool