【发布时间】:2021-01-31 22:52:27
【问题描述】:
我正在尝试根据我的要求执行并行处理,对于 4k-5k 元素并行处理,代码似乎可以正常工作。但是一旦要处理的元素开始增加,代码就会处理一些列表,然后在没有抛出任何错误的情况下,程序突然停止运行。
我检查了一下,程序没有挂起,RAM 可用(我有 16 Gb RAM),CPU 利用率甚至不到 30%。似乎无法弄清楚发生了什么。我有 100 万个元素要处理。
def get_items_to_download():
#iterator to fetch all items that are to be downloaded
yield download_item
def start_download_process():
multiproc_pool = multiprocessing.Pool(processes=10)
for download_item in get_items_to_download():
multiproc_pool.apply_async(start_processing, args = (download_item, ), callback = results_callback)
multiproc_pool.close()
multiproc_pool.join()
def start_processing(download_item):
try:
# Code to download item from web API
# Code to perform some processing on the data
# Code to update data into database
return True
except Exception as e:
return False
def results_callback(result):
print(result)
if __name__ == "__main__":
start_download_process()
更新 -
发现错误- BrokenPipeError: [Errno 32] Broken pipe
追踪-
Traceback (most recent call last):
File "/usr/lib/python3.6/multiprocessing/pool.py", line 125, in worker
put((job, i, result))
File "/usr/lib/python3.6/multiprocessing/queues.py", line 347, in put
self._writer.send_bytes(obj)
File "/usr/lib/python3.6/multiprocessing/connection.py", line 200, in send_bytes
self._send_bytes(m[offset:offset + size])
File "/usr/lib/python3.6/multiprocessing/connection.py", line 404, in _send_bytes
self._send(header + buf)
File "/usr/lib/python3.6/multiprocessing/connection.py", line 368, in _send
n = write(self._handle, buf)
BrokenPipeError: [Errno 32] Broken pipe
【问题讨论】:
-
我希望您在尝试从同一个 api 并行下载 100 万个项目之前检查了他们的请求速率限制。
-
是的,我有..这就足够了,如果我只是简单地下载所需的项目,它就可以正常工作,但只要我将处理元素引入多处理。然后它开始失败..
-
尝试使用
processes=1看看它是否仍然失败。 16GB 对于 10 个进程来说并不多,你的操作系统可能已经杀死了一个进程。尝试使用concurrent.futures.ProcessPoolExecutor而不是multiprocessing.Pool,如果发生这种情况,它将立即中断。还要测试注释掉数据库部分是否有帮助。print()是你的朋友,用它来归零它开始挂起的位置。 -
单个进程不会发生。当 processes=1 事情顺利进行到最后。
-
您对我下面的回复有任何反馈吗?因为如果您尝试了我的建议并让我知道发生了什么,我可能会有进一步的建议。例如,您是否发现确实有任务挂起但现在超时?或者通过以 1000 的批量提交它运行到完成(据我所知,这是有问题的——如果是这种情况,它应该以更大的批量工作)。
标签: python-3.x python-3.6 python-multiprocessing