【问题标题】:Sending many post requests [closed]发送许多帖子请求[关闭]
【发布时间】:2018-04-07 03:22:37
【问题描述】:

我对 Python 和请求比较陌生,所以我不确定最好的方法。

我需要向 URL 发送大量 POST 请求。现在,我只是使用一个循环并发送请求,根据互联网,每 10 到 30 秒产生大约 100 个帖子。我正在寻找一种更快且发布更多帖子的方法。向我推荐了多处理,但我在这方面的知识非常缺乏(我已经冻结了我的计算机试图生成太多进程)。

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

【问题讨论】:

  • 在您的代码中包含一些示例会很有帮助,这些示例可以显示您当前正在做什么,以及您认为哪些领域需要改进。谢谢。

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


【解决方案1】:

这是取自http://skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio/ 的代码示例,它可能会解决您的问题。它使用 requests 库为异步调用发出请求和 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())

我还建议阅读整篇文章,因为它显示了使用大量线程时的时间比较。

【讨论】:

  • 如果你不打算在任何地方使用异步套接字,你真的不需要将asyncio 添加到等式中。它只是运行一个循环将所有内容分派到线程池执行器,这更容易直接使用。
【解决方案2】:

这里没有理由使用多处理。向 HTTP 服务器发出请求几乎完全受 I/O 限制,而不是 CPU 限制,因此线程工作得很好。

在 stdlib 的 concurrent.futures 文档中使用 ThreadPoolExecutor 的第一个示例完全符合您的要求,除了使用 urllib 而不是 requests


如果您正在做任何复杂的事情,请查看requests-futures


如果您确实确实出于某种原因需要使用多处理(例如,您正在对每个结果进行大量文本处理,并且您希望将其与请求并行化),您只需将 ThreadPoolExecutor 切换为 ProcessPoolExecutor 即可,无需更改代码中的任何其他内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多