многопроцессорный пул Python, блокирующий основной поток - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий фрагмент, который пытается разделить обработку по нескольким подпроцессам.

def search(self):
    print("Checking queue for jobs to process")
    if self._job_queue.has_jobs_to_process():

        print("Queue threshold met, processing jobs.")
        job_sub_lists = partition_jobs(self._job_queue.get_jobs_to_process(), self._process_pool_size)
        populated_sub_lists =  [sub_list for sub_list in job_sub_lists if len(sub_list) > 0]
        self._process_pool.map(process, populated_sub_lists)
        print("Job processing pool mapped")

Функция поиска вызывается основным процессом в цикле while, и если очередь достигает порогового значения, пул обработки сопоставляется с функцией процесса с заданиями, полученными из очереди. У меня вопрос: блокирует ли многопроцессорный пул python основной процесс во время выполнения или он немедленно продолжает выполнение? Я не хочу встречаться со сценарием, в котором «has_jobs_to_process ()» оценивается как true, а во время обработки заданий он оценивается как true для другого набора заданий, а «self._process_pool.map (process, populated_sub_lists)» вызывается опять же, поскольку я не знаю последствий повторного вызова map во время работы процессов.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

multiprocessing.Pool.map блокирует вызывающий поток (не обязательно MainThread!), не весь процесс. Другие потоки родительского процесса не будут заблокированы. Вы можете вызывать pool.map из нескольких потоков в родительском процессе, не нарушая ничего (хотя это не имеет особого смысла). Это потому, что Pool использует поточно-безопасный queue.Queue для внутреннего использования, поскольку он _taskqueue.

0 голосов
/ 02 ноября 2018

Из многопроцессорных документов multiprocessing.map будет блокировать основной процесс во время выполнения до тех пор, пока результат не будет готов, а multiprocessing.map_async - нет.

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