Python Многопроцессорность запрещает печать в основном процессе после создания процессов - PullRequest
0 голосов
/ 19 июня 2020

Я пытался убедиться, что правильно настроил этот код перед запуском процессов. После добавления некоторых операторов печати я обнаружил, что печатаются только «внешние» и «внутренние», и я не могу понять, почему другие операторы печати не выполняются.

import multiprocessing
from itertools import product

retailer_ids = [41, 499]  # defined retailers
product_ids = [4, 5, 10, 11, 12]  # ProductIDs to search on
NUMBER_OF_PROCESSES = 2

retailer_products = list(product(retailer_ids, product_ids))

# Start processing the retailer/product combinations
for i in range(0, len(retailer_products), NUMBER_OF_PROCESSES):
    print('outer')
    try:
        current_processes = []
        for j in range(0, NUMBER_OF_PROCESSES):
            print('inner')
            process = multiprocessing.Process(scrape_retailer_product, retailer_products[i+j])
            #process.start()
            current_processes.append(process)
        # wait for current process to finish before starting more
        print('waiting for processes to complete')
        for p in current_processes:
            p.join()

        print('completed')

    # something bad happened during process creation or a
    # a scrape process returned with an exception it could not handle
    except Exception as e:
        for p in current_processes:
            p.terminate()
            print('term')
            exit()

1 Ответ

0 голосов
/ 19 июня 2020

Проблема в том, что вы перехватываете все исключения. Таким образом, ваш код не передавал правильные аргументы конструктору Process (который генерировал AssertionError), но ваш оператор catch молча обрабатывал исключение.

Текущее исключение:

Traceback (most recent call last):
  File "C:\Users\MiguelAngel\Downloads\test.py", line 19, in <module>
    process = multiprocessing.Process(scrape_retailer_product, args=(retailer_products[i+j]))
  File "C:\Users\MiguelAngel\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 82, in __init__
    assert group is None, 'group argument must be None for now'
AssertionError: group argument must be None for now

Я полагаю, что scrape_retailer_product - это функция, которая должна выполняться в новом процессе. Следовательно, согласно документации , вызов конструктора должен быть:

process = multiprocessing.Process(target=scrape_retailer_product, 
                                  args=(retailer_products[i+j],))

Если вы хотите перехватить все исключения многопроцессорности, вы должны перехватить multiprocessing.ProcessError. Согласно документации , это базовый класс всех исключений многопроцессорной обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...