Python 3.4多处理,代码不会超过循环(包含Queue)

时间:2016-06-20 10:23:36

标签: python python-3.x multiprocessing

在我在其他代码中实现之前,我已经编写了一些代码来测试多处理。主代码向另一个程序发送一个数字(在另一个核心上运行)。该程序递增并返回该数字。主代码递增并再次返回该值。一切运行良好,但主程序中的循环,这是一段时间<超时表格永远不会退出。对我来说似乎很简单,但它永远不会存在循环。我想知道它是否在没有返回任何值时挂起(.get()),但是我尝试了'try:',并且使超时非常短并且循环很大。有什么建议吗?

代码在Windows7上运行,最终将在Raspberry Pi 2上运行。

主程序

import multiprocessing as mp
import multi_processing_slave as MPS
from time import perf_counter as TimeIs

if __name__ == "__main__":
    print("Hello World")
    mp.set_start_method("spawn")
    q = mp.Queue()
    r = mp.Queue()
    p = mp.Process(target = MPS.foo, args = (q, r))
    p.start()
    ThisVar = 0
    Timer = TimeIs() + 2
    while TimeIs() < Timer - 1: pass
    print("time remaining is", Timer - TimeIs())
    while TimeIs() < Timer:
        #try:
        r.put(ThisVar)
        #except: pass
        #try:
        ThisVar = int(q.get()) + 1
        #except:
        #r.put(ThisVar)
        print("master ThisVar", ThisVar, "and time remaining is", round(Timer - TimeIs(), 4))
    #p.join()
    #p.close()
    p.terminate()
    print("at end, ThisVar is", ThisVar, "and", Timer - TimeIs(), "seconds remaining")

奴隶程序名为multi_processing_slave

def foo(q, r):
    for i in range(100):
        ThisVar2 = r.get() + 1
        q.put(ThisVar2)
        print("foo value", ThisVar2)
    print("foo has finished")
    return

1 个答案:

答案 0 :(得分:1)

从属进程退出后,您的主进程再执行一次r.put(),然后一直等待q.get()返回。您可以通过向q.get()提供超时值(以秒为单位)来解决问题:

ThisVar = int(q.get(timeout=1)) + 1

请注意,q.get()的超时会引发Empty例外。

您如何自己发现此问题:

  1. 添加调试打印语句,显示程序的进度和状态。

  2. 学习使用调试器。