Cod*_*ist 3 python django fork process httprequest
假设我有办法将http请求发送到服务器.如何将这些请求中的两个(或更多)同时发送到服务器?例如,可能通过fork进程?我该怎么做?(我也在使用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)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想你想在这里使用线程而不是分离新进程.虽然在某些情况下线程很糟糕,但这不是真的.此外,我认为您想要使用concurrent.futures而不是直接使用线程(或进程).
例如,假设您有10个网址,并且您目前正在连续执行这些网址,如下所示:
results = map(tester, urls)
Run Code Online (Sandbox Code Playgroud)
但是现在,你想一次发送2个.只需将其更改为:
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool:
results = pool.map(tester, urls)
Run Code Online (Sandbox Code Playgroud)
如果你想一次尝试4而不是2,只需改变max_workers.实际上,您应该尝试使用不同的值来查看哪种方法最适合您的程序.
如果你想做一些有点发烧友的事情,请参阅文档 - 主要的ThreadPoolExecutor示例几乎就是你正在寻找的东西.
不幸的是,在2.7中,该模块没有附带标准库,因此您必须从PyPI 安装backport.
如果已pip安装,则应该如下所示:
pip install futures
Run Code Online (Sandbox Code Playgroud)
......或者也许sudo pip install futures,在Unix上.
如果你没有pip,请先获取它(按照上面的链接).
您有时希望使用进程而不是线程的主要原因是您有大量的CPU绑定计算,并且您希望利用多个CPU核心.在Python中,线程无法有效地耗尽所有核心.因此,如果任务管理器/活动监视器/任何显示您的程序在一个核心上使用100%CPU,而其他都是0%,则进程就是答案.有了futures,你所要做的就是改变ThreadPoolExecutor到ProcessPoolExecutor.
与此同时,有时你需要的不仅仅是"给我一个神奇的工人池来完成我的任务".有时你想要运行一些非常长的工作而不是一堆小工作,或者自己对工作进行负载平衡,或者在工作之间传递数据,或者其他什么.为此,您想要使用multiprocessing或threading代替futures.
非常罕见的,甚至是过于高的水平,并直接告诉Python创建一个新的子进程或线程.为此,你一直到os.fork(仅限Unix)或thread.
| 归档时间: |
|
| 查看次数: |
7054 次 |
| 最近记录: |