【问题标题】:Code written using multiprocessing module is not giving any output使用多处理模块编写的代码没有给出任何输出
【发布时间】:2023-03-21 08:16:01
【问题描述】:

所以我正在尝试学习多处理模块并编写了一个代码(如下),其中生成了 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】:

    第一个问题是start必须是start()

    另外,不同的进程有不同的全局变量,所以print_lock = Lock()是每个进程中不同的锁。您必须创建一次锁并将其传递给各个进程。这也适用于队列。

    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
    

    【讨论】:

    • 谢谢你的回答我有两个问题是不是需要在多处理中执行锁定我们应该使用acquire()和release(),第二个是我在在线编译器中运行你的代码它给出了所述的输出,但是当我在我的机器上运行它时,它只给出最终输出,即所花费的时间,而不是整个输出
    • @louis 锁支持上下文管理器接口,因此当与with 一起使用时,进入with 时调用acquire,退出时调用release。这是一种方便,您不必记得调用 release。你在你的机器上使用 IDE 吗?一些 IDE 不处理多处理。新进程未连接到同一个终端,您看不到输出。在 Windows 上的 cmd.exe 等简单终端中运行。
    • 我使用的是普通的python shell
    • @louisphilippe 什么是“普通的 python shell”?闲?那是一个不支持正确多处理的 IDE,至少在 Windows 上是这样。请明确点。你在什么操作系统上?如果在 Windows 上,请使用命令窗口而不是 IDLE。
    • 是的,它是 IDE 没关系,它正在处理 cmd 最后一个问题,尽管你为什么不使用专为多处理设计并具有 task_done() 和 join() 等功能的 joinablequeue 类
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2017-08-05
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多