проблемы многопроцессорности и доступа к очереди в Python - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть следующий код:

import multiprocessing
import queue
import time

to_delete = queue.Queue()

def parallel(args):
    return para_print(*args)

def para_print(sngl, dbl, iter):
    to_delete.put(f"{sngl}, {dbl}, {iter}")

if __name__ == '__main__':
    multiprocessing.freeze_support()

    expression_list = [('a', 'aa', 1), ('b', 'bb', 2), ('c', 'cc', 3), ('d', 'dd', 4)]
    pool = multiprocessing.Pool(multiprocessing.cpu_count() - 1)
    result = pool.map(parallel, expression_list)

    print(to_delete.qsize())
    while not to_delete.empty():
        print(to_delete.get())

Результатом является «0», напечатанный как размер очереди, и ничего не помещается правильно в очередь - или не извлекается из нее. Что, черт возьми, я здесь делаю не так?

1 Ответ

1 голос
/ 07 ноября 2019

Вы должны использовать очередь из multiprocessing. Стандартный не работает правильно между процессами. Вот пересмотренный код ..

import multiprocessing

to_delete = multiprocessing.Queue()

def parallel(args):
    return para_print(*args)

def para_print(sngl, dbl, iter):
    to_delete.put(f"{sngl}, {dbl}, {iter}")


if __name__ == '__main__':
    multiprocessing.freeze_support()

    expression_list = [('a', 'aa', 1), ('b', 'bb', 2), ('c', 'cc', 3), ('d', 'dd', 4)]
    pool = multiprocessing.Pool(multiprocessing.cpu_count() - 1)
    result = pool.map(parallel, expression_list)

    print(to_delete.qsize())
    while not to_delete.empty():
        print(to_delete.get())
...