在我在其他代码中实现之前,我已经编写了一些代码来测试多处理。主代码向另一个程序发送一个数字(在另一个核心上运行)。该程序递增并返回该数字。主代码递增并再次返回该值。一切运行良好,但主程序中的循环,这是一段时间<超时表格永远不会退出。对我来说似乎很简单,但它永远不会存在循环。我想知道它是否在没有返回任何值时挂起(.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
答案 0 :(得分:1)
从属进程退出后,您的主进程再执行一次r.put()
,然后一直等待q.get()
返回。您可以通过向q.get()
提供超时值(以秒为单位)来解决问题:
ThisVar = int(q.get(timeout=1)) + 1
请注意,q.get()
的超时会引发Empty
例外。
您如何自己发现此问题:
添加调试打印语句,显示程序的进度和状态。
学习使用调试器。