Ответ 1
Для вашего второго примера вы уже сами дали объяснение --- Queue
- это модуль, который нельзя вызвать.
В третьем примере: я предполагаю, что вы используете Queue.Queue
вместе с multiprocessing
. A Queue.Queue
не будет передаваться между процессами. Если Queue.Queue
объявлен перед процессами, каждый процесс получит копию, которая не зависит от каждого другого процесса. Элементы, размещенные в Queue.Queue
родителем перед запуском детей, будут доступны каждому ребенку. Элементы, помещенные в Queue.Queue
родителем после запуска дочернего объекта, будут доступны только родителям. Queue.Queue
выполняется для обмена данными между различными потоками внутри одного и того же процесса (с помощью модуля threading). Многопроцессорные очереди предназначены для обмена данными между различными процессами Python. Хотя API выглядит аналогично (он был разработан таким образом), основные механизмы принципиально отличаются.
-
multiprocessing
очереди обмениваются данными путем сортировки (сериализации) объектов и отправки их по трубам. -
Queue.Queue
использует структуру данных, которая совместно используется потоками и блокировками/мьютексами для правильного поведения.