Многопроцессорная обработка Python. Мертвые блокировки очереди на помещенном и добираются

У меня есть проблемы мертвой блокировки с этой частью кода:


def _entropy_split_parallel(data_train, answers_train, weights):
    CPUS = 1 #multiprocessing.cpu_count()
    NUMBER_TASKS = len(data_train[0])
    processes = []

    multi_list = zip(data_train, answers_train, weights)

    task_queue = multiprocessing.Queue()
    done_queue = multiprocessing.Queue()

    for feature_index in xrange(NUMBER_TASKS):
        task_queue.put(feature_index)

    for i in xrange(CPUS):
        process = multiprocessing.Process(target=_worker, 
                args=(multi_list, task_queue, done_queue))
        processes.append(process)
        process.start()

    min_entropy = None
    best_feature = None
    best_split = None
    for i in xrange(NUMBER_TASKS):
        entropy, feature, split = done_queue.get()
        if (entropy < min_entropy or min_entropy == None) and entropy != None:
            best_feature = feature
            best_split = split

    for i in xrange(CPUS):
        task_queue.put('STOP')

    for process in processes:
        process.join()

    return best_feature, best_split


def _worker(multi_list, task_queue, done_queue):
    feature_index = task_queue.get()
    while feature_index != 'STOP':
        result = _entropy_split3(multi_list, feature_index)
        done_queue.put(result)
        feature_index = task_queue.get()

То, когда я запускаю свою программу, она хорошо работает для нескольких, пробегает _entropy_split_parallel, но в конечном счете мертвые блокировки. Родительский процесс блокируется на done_queue.get(), и рабочий процесс блокируется на done_queue.put(). Так как очередь всегда пуста, когда это происходит, блокируясь на get ожидается. То, что я не понимаю, - то, почему рабочий блокируется на put, так как очередь, очевидно, не полна (это пусто!). Я попробовал block и timeout аргументы ключевого слова, но получают тот же результат.

Я использую многопроцессорный бэкпорт, так как я застреваю с Python 2.5.


Править: Похоже, что я также получаю проблемы мертвой блокировки с одним из примеров, которым предоставляют многопроцессорный модуль. Это - третий пример от нижней части здесь. Заведение в тупик только, кажется, происходит, если я много раз называю метод тестирования. Например, изменяя нижнюю часть сценария к этому:


if __name__ == '__main__':
    freeze_support()
    for x in xrange(1000):
        test()

Править: Я знаю, что это - старый вопрос, но тестирующие шоу, что это больше не проблема на окнах с Python 2.7. Я попробую Linux и сообщу.

6
задан ajduff574 15 September 2010 в 16:59
поделиться