我在使用多处理模块中的 Process 时遇到问题。不幸的是,在我以前创建一个线程并且一切正常之前,我不得不进行更改以优化性能。
这是我玩游戏的代码,它基本上使用计算机视觉进行对象检测,并通过使用单独的进程来启动游戏。
#opecv infinite loop for frames processing
while True:
# detect object, code omitted
k = cv2.waitKey(20) & 0xFF
# when user press key 's' start the game
if (k == ord('s') or k == ord('S')) and start is False:
start = True
info = False
# # t = Thread(target=playGame, args=(k,))
# # t = Thread(target=playGame)
# # t.start() with threads worked successfully
p = Process(target=playGame)
p.start()
# if user press 'p' capture marker position and set boolean flag to true
elif k == ord('p') or k == ord('P'):
waitForUserMove = True
这是我的
playGame()
包含游戏循环的函数:def playGame():
#omitted code
while gameIsPlaying:
getUserMove()
#rest of code
最后这是我的
getUserMove()
包含 while 循环以等待用户移动的函数:def getUserMove():
while waitForUserMove is False:
pass
所以基本上当用户移动并按下键'p'时,它会更改 bool 标志
waitForUserMove
至True
并自动从 while 循环中中断,执行其余代码。正如我在使用线程之前所说的一切正常,现在我用线程替换进程我遇到了这个问题, bool 标志
waitForUserMove
更改为 true,但由于某些原因,流程无法接收此信息。换句话说,一旦用户按下“p”键, bool 标志
waitForUserMove
就会改变。至True
就在进程之外,在进程内部这个waitForUserMove
仍然是 False
.那么我该怎么做才能将此信息发送到进程以更改标志
waitForUserMove
来自 False
至True
?我希望很清楚,我找不到更好的词来写我的问题。预先感谢您的帮助。
最佳答案
多处理从根本上不同于线程。在多进程中,两个进程有一个单独的内存地址空间,所以如果一个进程写入他的内存,兄弟进程就看不到变量的变化。
要在不同进程之间交换数据,您应该引用 Exchanging Objects Between Processes
在您的情况下,您只有一种方式的通信,因此队列应该可以工作:
设置队列:
q = Queue()
p = Process(target=playGame, args=(q,))
发送 playGame:
def playGame(q):
#omitted code
while gameIsPlaying:
move = getUserMove()
q.put(move)
在主进程中接收:
def getUserMove():
move = q.get()
请注意
q.get()
正在阻塞,这意味着主进程被阻塞,直到 playGame
在队列中添加一些东西。如果您需要同时做一些事情,请使用 q.get_nowait()
关于Python - 使用多处理和按键检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41792866/