Python - 使用多处理和按下键检测

时间:2017-01-22 15:39:59

标签: python opencv multiprocessing

我在使用多处理模块进程时遇到问题。在我以前创建一个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

那么如何将此信息发送到流程以便将标记waitForUserMoveFalse更改为True

我希望很清楚,我找不到更好的词来写我的问题。提前感谢您的帮助。

1 个答案:

答案 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()