使用多处理模块编写的代码未提供任何输出

问题描述 投票:-1回答:1

因此,我试图学习多处理模块,并编写了以下代码,其中生成了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)
python python-multiprocessing python-multithreading
1个回答
-1
投票

第一个问题是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
© www.soinside.com 2019 - 2024. All rights reserved.