Почему этот код очереди Python обрабатывает элементы несколько раз? - PullRequest
3 голосов
/ 08 марта 2010

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

код:

#!/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!

Ожидаемый выход:

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

1 Ответ

8 голосов
/ 08 марта 2010

Пакет очереди не распознает процесс, он работает только для потоков. В вашем примере происходит следующее:

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

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

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