发送许多帖子请求

时间:2018-04-07 03:22:37

标签: python python-requests http-post python-multiprocessing

我对Python和请求相对较新,所以我不确定最好的方法。

我需要向URL发送大量POST请求。现在,我只是简单地使用一个循环并发送请求,每10到30秒就会产生大约100个帖子,具体取决于互联网。我正在寻找一种方法来更快地完成这项工作并增加更多帖子。我建议使用多处理,但我的知识非常缺乏(我已经冻结了我的计算机,试图产生太多的进程)。

如何有效实施多处理以提高结果?

2 个答案:

答案 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,然后在代码中不做任何其他更改。