Код, написанный с использованием многопроцессорного модуля, не дает никакого вывода - PullRequest
0 голосов
/ 11 апреля 2020

Итак, я пытаюсь изучить многопроцессорный модуль и написал код (ниже), в котором генерируется 4 процесса , которым назначено 8 заданий (в функции процессора ), и каждое задание содержит только спящую функцию (в примере функции задания ). Теперь я написал подобный код в модуле многопоточности , который работал нормально, но вот он не выводить ничего. Пожалуйста, помогите

from multiprocessing import Process, Lock
import multiprocessing 
import time

print_lock = Lock()

def exampleJob(worker):                 # function simulating some computation
    time.sleep(.5)
    print_lock.acquire()
    print(multiprocessing.current_process.pid,worker)
    print_lock.release()

def processor():                         #function where process pick up the job
    while True:
        worker = q.get()
        exampleJob(worker)
        q.task_done()

q = multiprocessing.JoinableQueue()
process = []

for x in range(4):
     p = multiprocessing.Process(target=processor)
     process.append(p)

for i in range(0,len(process)):
    process[i].start

start = time.time()
for worker in range(8):
    q.put(worker)
q.join()

print('Entire job took:',time.time() - start)

1 Ответ

0 голосов
/ 11 апреля 2020

Первая проблема: start должно быть start().

Кроме того, отдельные процессы имеют отдельные глобальные переменные, поэтому print_lock = Lock() - это разные блокировки в каждом процессе. Вы должны создать блокировку один раз и передать ее отдельным процессам. Это касается и очереди.

A JoinableQueue на самом деле не требуется. Требуется флаг дозорного, который сообщает процессам о выходе и присоединении к процессам.

Пример работы с другими исправлениями:

import multiprocessing as mp
import time

def exampleJob(print_lock,worker):                 # function simulating some computation
    time.sleep(.5)
    with print_lock:
        print(mp.current_process().name,worker)

def processor(print_lock,q):                       # function where process pick up the job
    while True:
        worker = q.get()
        if worker is None: # flag to exit the process
            break
        exampleJob(print_lock,worker)

# This "if" required for portability in some OSes.
# Windows for example creates new Python processes and imports the original script.
# Without this the below code would run again in each child process.
if __name__ == '__main__':

    print_lock = mp.Lock()
    q = mp.Queue()
    processes = [mp.Process(target=processor,args=(print_lock,q)) for _ in range(4)]

    for process in processes:
        process.start()   # OP code didn't *call* the start method.

    start = time.time()
    for worker in range(8):
        q.put(worker)

    for process in processes:
        q.put(None) # quit indicator

    for process in processes:
        process.join()

    print('Entire job took:',time.time() - start)

Вывод:

Process-2 2
Process-1 0
Process-3 1
Process-4 3
Process-3 6
Process-1 5
Process-2 4
Process-4 7
Entire job took: 1.1350018978118896
...