![](/img/trans.png)
[英]Python: How can i send multiple HTTP requests and receive the response?
[英]Python: How can i send multiple http requests at the same time? (like fork)
假设我有一种方法可以将HTTP请求发送到服务器。 如何将其中两个(或多个)请求同时发送到服务器? 例如,也许通过分叉过程? 我该怎么做? (我也在用django)
#This example is not tested...
import requests
def tester(request):
server_url = 'http://localhost:9000/receive'
payload = {
'd_test2': '1234',
'd_test2': 'demo',
}
json_payload = simplejson.dumps(payload)
content_length = len(json_payload)
headers = {'Content-Type': 'application/json', 'Content-Length': content_length}
response = requests.post(server_url, data=json_payload, headers=headers, allow_redirects=True)
if response.status_code == requests.codes.ok:
print 'Headers: {}\nResponse: {}'.format(response.headers, response.text)
谢谢!
我认为您想在这里使用线程,而不是分叉新进程。 尽管在某些情况下线程很糟糕,但在这里不是这样。 另外,我认为您想使用concurrent.futures
而不是直接使用线程(或进程)。
例如,假设您有10个URL,并且您当前正在连续执行这些操作,如下所示:
results = map(tester, urls)
但是现在,您想一次发送给他们2个。 只需将其更改为:
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool:
results = pool.map(tester, urls)
如果您想一次尝试4次而不是2次,则只需更改max_workers
。 实际上,您可能应该尝试不同的值,以查看最适合您的程序的值。
如果您想做些更简单的事情,请参阅文档-ThreadPoolExecutor主示例几乎正是您所需要的。
不幸的是,在2.7,该模块没有配备标准库,所以你必须要安装的反向移植一封来自PyPI。
如果您已经安装了pip
,则操作应该很简单:
pip install futures
…或在Unix上sudo pip install futures
。
如果您没有pip
,请先获取它(按照上面的链接)。
有时您想要使用进程而不是线程的主要原因是您有大量的CPU绑定计算,并且您想利用多个CPU内核。 在Python中,线程无法有效地耗尽所有内核。 因此,如果“任务管理器” /“活动监视器” /无论什么显示您的程序在一个内核上使用了100%的CPU,而其他内核都使用了0%,则进程就是答案。 对于futures
,您要做的就是将ThreadPoolExecutor
更改为ProcessPoolExecutor
。
同时,有时您不仅需要“给我一个神奇的工人来执行任务”。 有时,您想运行一些非常长的工作,而不是一堆小工作,或者自己对工作进行负载平衡,或者在工作之间传递数据,等等。 为此,您想使用multiprocessing
或threading
而不是futures
。
很少,即使那太高级了,也直接告诉Python创建一个新的子进程或线程。 为此,您可以一直使用os.fork
(仅在Unix上)或thread
。
我将使用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
,但是将pool概括为将输入映射到任何函数中,包括您提出的请求。 这些绿色小工具将与使用fork
几乎同时运行,但速度更快且重量更轻。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.