очередь питона и многопроцессорная очередь: как они себя ведут? - PullRequest
23 голосов
/ 29 мая 2009

Этот пример кода работает (я могу что-то написать в файле):

from multiprocessing import Process, Queue

queue = Queue()
def _printer(self, queue):
    queue.put("hello world!!")

def _cmdDisp(self, queue):
    f = file("Cmd.log", "w")
    print >> f, queue.get()
    f.close()

вместо этого другого примера нет: (errormsg: объект 'module' не вызывается)

import Queue

queue = Queue()
def _printer(self, queue):
    queue.put("hello world!!")

def _cmdDisp(self, queue):
    f = file("Cmd.log", "w")
    print >> f, queue.get()
    f.close()

этого другого примера нет (я не могу что-то записать в файл):

import Queue

queue = Queue.Queue()
def _printer(self, queue):
    queue.put("hello world!!")

def _cmdDisp(self, queue):
    f = file("Cmd.log", "w")
    print >> f, queue.get()
    f.close()

Может кто-нибудь объяснить разницу? а право делать?

1 Ответ

56 голосов
/ 29 мая 2009

Для вашего второго примера вы уже дали объяснение самостоятельно: Queue - это модуль, который не может быть вызван.

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

  • multiprocessing очереди обмениваются данными путем выбора (сериализации) объектов и отправки их по каналам.
  • Queue.Queue использует структуру данных, которая совместно используется потоками и блокировками / мьютексами для правильного поведения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...