我对Python和请求相对较新,所以我不确定最好的方法。
我需要向URL发送大量POST请求。现在,我只是简单地使用一个循环并发送请求,每10到30秒就会产生大约100个帖子,具体取决于互联网。我正在寻找一种方法来更快地完成这项工作并增加更多帖子。我建议使用多处理,但我的知识非常缺乏(我已经冻结了我的计算机,试图产生太多的进程)。
如何有效实施多处理以提高结果?
答案 0 :(得分:0)
以下是从http://skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio/获取的代码示例,可以解决您的问题。它使用请求库为异步调用发出请求和asyncio。您必须做的唯一更改是从GET调用到POST调用。
这是用Python 3.5编写的(如文章所述)
# Example 2: asynchronous requests
import asyncio
import requests
async def main():
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(
None,
requests.get,
'http://example.org/'
)
for i in range(20)
]
for response in await asyncio.gather(*futures):
pass
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
我还建议阅读整篇文章,因为它显示了使用大量线程时的时间比较。
答案 1 :(得分:0)
这里没有理由使用多处理。发出HTTP服务器的请求几乎完全是I / O绑定的,而不是CPU绑定的,所以线程工作正常。
在stdlib的concurrent.futures
文档中使用ThreadPoolExecutor
的第一个示例完全符合您的要求,除了使用urllib
而不是{{{ 1}}。
如果您正在做任何复杂的事情,请查看requests-futures
。
如果您真的做由于某种原因需要使用多处理(例如,您在每个结果上进行了大量的文本处理,并且您希望将其与请求一起并行化),您只需将requests
切换为ThreadPoolExecutor
,然后在代码中不做任何其他更改。