我有一个函数我正在调用multiprocessing.Pool
像这样:
from multiprocessing import Pool
def ingest_item(id):
# goes and does alot of network calls
# adds a bunch to a remote db
return None
if __name__ == '__main__':
p = Pool(12)
thing_ids = range(1000000)
p.map(ingest_item, thing_ids)
列表pool.map迭代包含大约100万个项目,
对于每个ingest_item()
调用,它将调用第三方服务并将数据添加到远程Postgresql数据库。
在12核机器上,它可以在24小时内处理~1,000 pool.map
个项目。 CPU和RAM使用率很低。
如何让它更快?
切换到线程是否有意义,因为瓶颈似乎是网络呼叫?
提前致谢!
答案 0 :(得分:1)
首先:记住您正在执行网络任务。你应该期望你的CPU和RAM使用率很低,因为网络比你的12核机器慢几个数量级。
也就是说,每个请求都有一个进程是浪费的。如果您开始遇到启动太多进程的问题,可以按照Library or tool to download multiple files in parallel
的建议尝试pycurl此pycurl示例与您的任务https://github.com/pycurl/pycurl/blob/master/examples/retriever-multi.py
非常相似答案 1 :(得分:1)
使用线程不太可能显着提高性能。这是因为无论您分解多少任务,所有请求都必须通过网络。
要提高性能,您可能希望查看第三方服务是否具有某种具有更好性能的批量请求API。
如果您的工作负载允许,您可以尝试使用某种缓存。但是,根据您对任务的解释,由于您主要发送数据而不是请求数据,因此听起来效果不大。您还可以考虑缓存打开的连接(如果您还没有这样做),这有助于避免非常慢的TCP握手。这种类型的缓存通常用于Web浏览器(例如Chrome)。
免责声明:我没有Python经验