многонишковият urllib2 замръзва на носовата рамка

Имам код на Python, който използва nose_parameterized както е показано по-долу:

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, той замръзва с помощта на nos (но все още работи добре с python). Освен това опитах urllib2.urlopen; същия проблем. Някакви идеи дали има „правилен“ (с възможност за отстраняване на грешки) начин да се заобиколи това?


person max    schedule 05.12.2014    source източник
comment
Може би това ще помогне   -  person Ali Gajani    schedule 05.12.2014
comment
Благодаря. Знам за този проблем, който сте свързали, но не мога да поставя нищо вътре в main не в настройката на носа, тъй като настройката се изпълнява след събирането на параметрите. Предвид ограниченията се надявах на заобиколно решение.   -  person max    schedule 06.12.2014


Отговори (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. Това ви позволява да разпределите вашето тестово изпълнение между набор от работни процеси, които изпълняват тестове паралелно, както сте планирали. Зад кулисите се използва многопроцесорен модул.

person Oleksiy    schedule 08.12.2014
comment
Благодаря. Това отговаря на въпроса. Ако заредя данните в тестовия метод, ще бъда принуден да правя всички твърдения там, а не в отделни тестови методи. Друг проблем е, че имам и някои тестове, които не могат да се изпълняват паралелно, което означава, че имам нужда от отделни тестове на носа... независимо от това, добре е да знам за тази функция. - person max; 11.12.2014