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_框架构建的。非常感谢。