多线程urllib2在鼻子框架上冻结

时间:2014-12-05 20:42:09

标签: python nose

我有一个使用nose_parameterized的python代码,如下所示:

from nose_parameterized import parameterized
from multiprocessing.pool import ThreadPool
import urllib2

def make_http_call(url, req_type):
    opener = urllib2.build_opener() # <=== this line causes it to freeze
    return 1

pool = ThreadPool(processes=4)
results = []
urls = ['a', 'b', 'c', 'd']
for url in urls:
    results.append(pool.apply_async(make_http_call, (url, 'html')))
d = {'add': []}
for ind, res in enumerate(results):
    d['add'].append((res.get(), 2+ind, 3+ind))

@parameterized(d['add'])
def test_add(a, b, c):
    assert a+b == c

这是代码的虚拟版本。基本上,我需要使用http请求响应加载测试参数,因为有很多url,我想多线程它们。 一旦我添加了urllib2.build_opener,它就会冻结使用鼻子(但仍可以正常使用python) 另外,我试过urllib2.urlopen;一样的问题。 任何想法是否适当&#39; (debuggable)一种解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用内置插件中的鼻子multiprocess,例如:

from nose_parameterized import parameterized
import urllib2

urls = ['http://www.google.com', 'http://www.yahoo.com']

@parameterized(urls)
def test_add(url):
    a = urllib2.urlopen(url).read()

    b = 2 + urls.index(url)
    c = 3 + urls.index(url)
    assert a+str(b) == str(c)

并使用nosetests --processes=2运行它。这使您可以在一组工作进程之间分发测试运行,这些进程按预期并行运行测试。在幕后,使用了多处理模块。