Является ли `queue.Queue` поточно-безопасным при доступе к нескольким подпроцессам с использованием` concurrent.futures.ProcessPoolExecutor`? - PullRequest
1 голос
/ 20 апреля 2020

Я широко использовал queue.Queue в ситуациях, когда я выполняю несколько потоков, например, используя concurrent.futures.ThreadPoolExecutor.

Я читал из блогов, что queue.Queue должен быть потокобезопасным, но означает ли это, что он потокобезопасен, если предположить, что интерпретатор Python одновременно выполняет только один поток ( GIL ), или он также является поточно-ориентированным в ситуациях, использующих multiprocessing, который обходит GIL , используя подпроцессы вместо потоков?

https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

ProcessPoolExecutor использует multiprocessing.queues.Queue для очереди вызовов и mp_context.SimpleQueue (многопроцессорная обработка) для очереди результатов - которые используются для связи между локальным потоком и процессами.

Хорошая графика c ProcessPoolExecutor


  • concurrent.futures.ProcessPoolExecutor stuff использует многопроцессорные очереди для связи между потоками и процессами.
  • В документах multiprocessing.queues.Queue конкретно указано, что это поток и безопасный процесс
  • В нижней части документации очереди находится примечание , относящееся к объекту мультипроцессинга. Вопрос ... for use in a multi-processing (rather than multi-threading) context
1 голос
/ 20 апреля 2020

Для этого в библиотеке multiprocessing разработан Queue

from multiprocessing import Queue

При этом используются сокеты для отправки байтовых данных, которые поточнобезопасны.

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