Python urllib2 urlopen将在多处理中被阻塞
我想利用多处理来加速每个公司的报表生成器 以下是测试脚本:Python urllib2 urlopen将在多处理中被阻塞,python,multiprocessing,urllib2,Python,Multiprocessing,Urllib2,我想利用多处理来加速每个公司的报表生成器 以下是测试脚本: from multiprocessing import Pool import os, time, random, json, urllib, urllib2, uuid def generate_report(url, cookie, company_id, period, remark): try: start = time.time() print('Run task %s (%s)...
from multiprocessing import Pool
import os, time, random, json, urllib, urllib2, uuid
def generate_report(url, cookie, company_id, period, remark):
try:
start = time.time()
print('Run task %s (%s)... at: %s \n' % (company_id, os.getpid(), start))
values = {
'companies': json.dumps([company_id]),
'month_year': period,
'remark': remark
}
data = urllib.urlencode(values)
headers = {
'Cookie': cookie
}
url = "%s?pid=%s&uuid=%s" % (url, os.getpid(), uuid.uuid4().get_hex())
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
content = response.read()
end = time.time()
print 'Task %s runs %0.2f seconds, end at: %s \n' % (company_id, (end - start), end)
return content
except Exception as exc:
return exc.message
if __name__=='__main__':
print 'Parent process %s.\n' % os.getpid()
p = Pool()
url = 'http://localhost/fee_calculate/generate-single'
cookie = 'xxx'
company_ids = [17,15,21,19]
period = '2017-08'
remark = 'test add remark from python script'
results = [p.apply_async(generate_report, args=(url,cookie,company_id,period,remark)) for company_id in company_ids]
for r in results:
print(r.get())
但我得到的结果如下:
Run task 17 (15952)... at: 1506568581.98
Run task 15 (17192)... at: 1506568581.99
Run task 21 (18116)... at: 1506568582.01
Run task 19 (1708)... at: 1506568582.05
Task 17 runs 13.50 seconds, end at: 1506568595.48
{"success":true,"info":"Successed!"}
Task 15 runs 23.60 seconds, end at: 1506568605.59
{"success":true,"info":"Successed!"}
Task 21 runs 34.35 seconds, end at: 1506568616.36
{"success":true,"info":"Successed!"}
Task 19 runs 44.38 seconds, end at: 1506568626.44
{"success":true,"info":"Successed!"}
似乎urllib2.urlopen(请求)已被阻止,请求不是并行发送的,而是有序发送的
为了测试多处理,脚本fee_calculate/generate single只有以下重要代码:
sleep(10)
请给我一些建议,谢谢
附言:
平台:windows10、python2.7、4 CPU这不是一个多处理问题。多处理正在按其应有的方式工作,通过观察所有任务几乎同时启动,您可以看到这一点 任务执行时间几乎完全由
http://localhost/fee_calculate/generate-single
。你是如何运行这个服务器的?如果观察每个报告的执行时间,您会注意到它们以大约10秒的步长递增,这是您在服务器端人为施加的处理延迟(sleep(10)
)
我怀疑您的本地服务器只是单线程的,因此一次只能处理一个请求。这意味着每个请求必须在处理下一个请求之前完成,因此,当您发出多个这样的并发请求时,处理时间实际上不会减少。您的机器有多少CPU核?试着运行os.cpu\u count(),看看结果如何。你确定时间应该更短吗?可能需要所有的时间?您可以尝试使用
async
代替multiprocessing
@DBrowne有四个cpu,因此,我只需像这样派生4个子进程:company_id=[17,15,21,19]@并对生成的报告进行修改,只需睡眠10秒即可进行测试。一开始,我怀疑本地服务器也是单线程的。所以我检查了XAMPP mpm_winnt_模块,并在Firefox上打开了多个选项卡。我检查了所有的响应标题,它们几乎同时返回,只有1~2秒的间隙当你在Firefox中同时打开多个标签时会发生什么?10秒后是否全部完成?或者需要更长的时间?我已经修复了这个错误。是的,这不是多处理问题。我认为错误是相同的cookie导致等待会话锁定。应用程序是基于zend_框架构建的。非常感谢。