6

假设我有一种方法可以将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)

谢谢!

4

2 回答 2

14

我认为您想在这里使用线程而不是分叉新进程。虽然在某些情况下线程很糟糕,但这里并非如此。另外,我认为您想使用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安装backport 。

如果您已经pip安装,这应该很简单:

pip install futures

……或者也许sudo pip install futures,在 Unix 上。

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


您有时想要使用进程而不是线程的主要原因是您有大量的 CPU 密集型计算,并且您希望利用多个 CPU 内核。在 Python 中,线程不能有效地用完所有的内核。因此,如果任务管理器/活动监视器/任何显示您的程序在一个内核上使用了 100% 的 CPU,而其他内核都为 0%,那么进程就是答案。有了futures,您所要做的就是更改ThreadPoolExecutorProcessPoolExecutor.


同时,有时您需要的不仅仅是“给我一个神奇的工人池来运行我的任务”。有时您想运行一些非常长的作业而不是一堆小的作业,或者自己对作业进行负载平衡,或者在作业之间传递数据,等等。为此,您想使用multiprocessingorthreading代替futures.

很少,即使太高级了,直接告诉 Python 创建一个新的子进程或线程。为此,您一直到os.fork(仅在 Unix 上)或thread.

于 2013-04-01T22:41:27.203 回答
3

我会使用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)

当然,这个例子提交了gets,但是 pool 被泛化为将输入映射到任何函数,包括,比如说,你的请求。这些 greenlets 将几乎与使用同时运行,fork但速度更快,重量更轻。

于 2013-04-01T22:29:59.547 回答