Как многопроцессорные разделяют общую очередь? - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу запустить 4 процесса, которые помещают целое число в очередь, когда счетчик делится на 100. Одновременно другой процесс непрерывно читает и печатает его. Пожалуйста, исправьте мой код для запуска ... Я получаю сообщение об ошибке ['Очередь'объект не повторяется]

from multiprocessing import Lock, Process, Queue, current_process
import time
import queue 


def doFirstjob(process_Queue):
    i=0

    while True:
        if i%100==0:
            process_Queue.put(i)
        else:
            i+=1


def doSecondjob(process_Queue):
    while(1):
        if not process_Queue.Empty:
            task = process_Queue.get()
            print("task: ",task)
        else:
            time.sleep(0.2)

def main():
    number_of_processes = 4
    process_Queue = Queue()
    processes = []
    process_Queue.put(1)

    q = Process(target=doSecondjob, args=(process_Queue))
    q.start()

    for w in range(number_of_processes):
        p = Process(target=doFirstjob, args=(process_Queue))
        processes.append(p)
        p.start()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 04 декабря 2018

Вы получили ошибку, потому что Process ожидал список / кортеж в аргументах / аргументах.

Также вместо Empty он должен быть пустым.

измените код на ниже.

from multiprocessing import Lock, Process, Queue, current_process
import time
import queue 


def doFirstjob(process_Queue):
    i=0

    while True:
        print("foo")
        if i%100==0:
            process_Queue.put(i)
        else:
            i+=1


def doSecondjob(process_Queue):
    while(1):
        print("bar")
        if not process_Queue.empty:
            task = process_Queue.get()
            print("task: ",task)
        else:
            time.sleep(0.2)

def main():
    number_of_processes = 4
    process_Queue = Queue()
    processes = []
    process_Queue.put(1)

    q = Process(target=doSecondjob, args=(process_Queue,))
    q.start()

    for w in range(number_of_processes):
        p = Process(target=doFirstjob, args=(process_Queue,))
        processes.append(p)
        p.start()


if __name__ == '__main__':
    main()
...