优化网络绑定多处理代码

时间:2015-07-30 18:52:14

标签: python

我有一个函数我正在调用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使用率很低。

如何让它更快?

切换到线程是否有意义,因为瓶颈似乎是网络呼叫?

提前致谢!

2 个答案:

答案 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经验