Python:如何同时发送多个http请求?(像叉子一样)

Python:如何同时发送多个http请求?(像叉子一样),python,django,process,fork,httprequest,Python,Django,Process,Fork,Httprequest,假设我有一种发送到服务器的方法。如何能够同时向服务器发送其中两个(或更多)请求?例如,可能通过fork进程?我怎么做? (我也在使用django) 谢谢 我会使用gevent,它可以在所谓的绿色线程中启动这些线程: # This will make requests compatible from gevent import monkey; monkey.patch_all() import requests # Make a pool of greenlets to make your re

假设我有一种发送到服务器的方法。如何能够同时向服务器发送其中两个(或更多)请求?例如,可能通过fork进程?我怎么做? (我也在使用django)


谢谢

我会使用
gevent
,它可以在所谓的绿色线程中启动这些线程:

# This will make requests compatible
from gevent import monkey; monkey.patch_all()
import requests

# Make a pool of greenlets to make your requests
from gevent.pool import Pool
p = Pool(10)

urls = [..., ..., ...]
p.map(requests.get, urls)

当然,本例提交了
get
s,但池被泛化为将输入映射到任何函数中,包括(比如)您的请求。这些greenlet将与使用
fork
几乎同时运行,但速度更快,重量更轻。

我认为您希望在这里使用线程,而不是派生新进程。虽然线程在某些情况下是不好的,但这里不是这样。另外,我认为您希望使用而不是直接使用线程(或进程)

例如,假设您有10个URL,并且您当前正在连续执行一个URL,如下所示:

results = map(tester, urls)
但是现在,你想一次发送两个。只需将其更改为:

with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool:
    results = pool.map(tester, urls)
如果您想一次尝试4个而不是2个,只需更改
max\u workers
。事实上,您可能应该尝试使用不同的值,看看什么最适合您的程序

如果你想做一些更有趣的事情,请参阅文档,主要内容几乎正是你想要的

不幸的是,在2.7中,这个模块没有标准库,所以您必须从PyPI安装

如果您已安装,这应简单到:

pip install futures
…或者在Unix上安装sudo pip futures

如果您没有
pip
,请先获取它(按照上面的链接)


有时您希望使用进程而不是线程的主要原因是,您有大量CPU限制的计算,并且希望利用多个CPU核。在Python中,线程不能有效地使用所有核心。因此,如果任务管理器/活动监视器/任何东西显示您的程序在一个核心上使用了100%的CPU,而其他的都是0%,那么进程就是答案。使用
futures
,只需将
ThreadPoolExecutor
更改为
ProcessPoolExecutor


同时,有时你需要的不仅仅是“给我一个神奇的员工池来运行我的任务”。有时,您希望运行一些非常长的作业,而不是一堆小作业,或者自己平衡作业的负载,或者在作业之间传递数据,或者其他任何事情。为此,您希望使用或而不是
futures


非常罕见的情况是,即使这样也太高级了,直接告诉Python创建一个新的子进程或线程。为此,您可以一直使用(仅在Unix上)或。

如果您真的想使用
gevent
请求
,那么使用可能比自己做要好。但实际上,当你只同时做一些事情时(OP询问了2…),使用greenlet没有任何好处。缺点是,如果您添加任何CPU绑定的代码,您的整个系统就会突然停止,您必须重新开始并以不同的方式重写。关于
grequests
的公平点。我不得不想象,上面示例中任何CPU绑定的代码都在服务器端,在这种情况下,我不确定如何看待使用
gevent
是有害的。这并不是真的有害,它只是增加了一些额外的学习内容,并使其更难适应(不太可能,但并非不可能)事件,您需要添加CPU绑定的客户机代码,并且需要stdlib之外的东西,所有这些都是很小的负面影响,但是如果没有优势,为什么还要产生一些小负面影响呢?我与您关于包含标准库之外的东西的观点有很大的关联。虽然在这种情况下我没有理由这样做,但我经常对python线程抱有偏见:-)好吧,python线程在CPU并行性方面几乎和Greenlet一样糟糕,在执行数千个并发I/O绑定任务方面几乎和进程一样糟糕,所以它们常常是错误的选择。但有时它们是正确的选择,毫无理由地避免它们是愚蠢的。(我知道,你称之为“偏见”,所以你已经理解了这一点;我只是为了其他读者的利益而解释这一点。)谢谢你的回答非常有趣,但只要我不太熟悉多线程处理/线程,我需要问你是否在你的帖子中提到了5种不同的东西。对吗?不幸的是,我使用的是2.7,所以我不得不使用futures。@JorgeCode:我不确定你所说的“在你的帖子中提到5件不同的事情”到底是什么意思。我的意思是
os.fork
多处理
线程
并发.未来
未来
@JorgeCode:我明白了。你特别问了fork,所以我想你知道那是什么意思。我重写了答案,先给你我的建议答案,然后再讨论其他选择。这应该比原始版本更容易理解。很抱歉给您带来困惑。谢谢您的回答。
pip install futures