繁体   English   中英

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

[英]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


同时,有时您不仅需要“给我一个神奇的工人来执行任务”。 有时,您想运行一些非常长的工作,而不是一堆小工作,或者自己对工作进行负载平衡,或者在工作之间传递数据,等等。 为此,您想使用multiprocessingthreading而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM