2010-03-08 3 views
3

Ниже представлен тестовый файл, который я создал. Почему каждый процесс печатает число от 1 до 5 и числа, не разделенные над процессами?Почему этот код очереди python обрабатывает несколько элементов?

код:

#!/usr/bin/python 
from subprocess import * 

from Queue import Queue 
from Queue import Empty 

import multiprocessing 
from multiprocessing import Process 

def main(): 
    r = Runner() 
    r.run() 

class Runner(object): 
    processes = [] 

    def run(self): 
     q = Queue() 
     for t in range(1,6): 
      q.put(t) 

     for pi in range(1,4): 
      p = Process(target=self.runFromQueue, args=(q,)) 
      p.start() 
      self.processes.append(p) 

     for p in self.processes: 
      p.join() 

     print "Finished!" 

    def runFromQueue(self, q): 
     try: 
      while True: 
       number = q.get_nowait() 
       print str(number) 
       q.task_done() 

     except Empty: 
      pass 


if __name__ == "__main__": 
    main() 

Ouput:

$ ./test_threads.py 
1 
2 
3 
4 
5 
1 
1 
2 
3 
2 
4 
3 
5 
4 
5 
Finished! 

Ожидаемое Ouput:

$ ./test_threads.py 
1 
2 
3 
4 
5 
Finished! 

ответ

8

Пакет очереди не обрабатывает известно, он работает только для потоков. Далее происходит в вашем примере:

  1. Создание очереди и заполнить с номерами
  2. вилка 4 процессов. Это копирует содержимое памяти в каждый подпроцесс, в том числе заполненной очереди
  3. Каждого процесс опустошает свою копию очереди

Вы должны использовать Queue класс предоставленного многопроцессорных.

+0

О да, это было. Благодаря! –

Смежные вопросы