我在使用多处理模块进程时遇到问题。在我以前创建一个Thread之前,一切都运行良好,不幸的是,我不得不改变以优化性能。
这是我玩游戏的代码,它主要使用计算机视觉进行对象检测,并通过使用单独的进程允许游戏启动。
#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'键时,它会将布尔标志waitForUserMove
更改为True
并自动从while循环中断,执行其余代码。< / p>
一些正如我之前所说的使用线程一切正常,现在我用线程替换进程我遇到了这个问题,布尔标志waitForUserMove
变为真,但是这个信息不能被进程收到的原因。
换句话说,一旦用户按下“p”键,就会在流程外部将布尔标记waitForUserMove
更改为True
,在流程内waitForUserMove
仍然是False
那么如何将此信息发送到流程以便将标记waitForUserMove
从False
更改为True
?
我希望很清楚,我找不到更好的词来写我的问题。提前感谢您的帮助。
答案 0 :(得分:1)
多处理与线程根本不同。在多处理中,两个进程具有单独的内存地址空间,因此如果一个进程写入其内存,则兄弟进程无法看到变量的变化。
要在不同流程之间交换数据,请参阅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()