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

标签 python opencv multiprocessing

我在使用多处理模块中的 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 标志waitForUserMoveTrue并自动从 while 循环中中断,执行其余代码。

正如我在使用线程之前所说的一切正常,现在我用线程替换进程我遇到了这个问题, bool 标志 waitForUserMove更改为 true,但由于某些原因,流程无法接收此信息。

换句话说,一旦用户按下“p”键, bool 标志 waitForUserMove 就会改变。至True就在进程之外,在进程内部这个waitForUserMove仍然是 False .

那么我该怎么做才能将此信息发送到进程以更改标志 waitForUserMove来自 FalseTrue ?

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

最佳答案

多处理从根本上不同于线程。在多进程中,两个进程有一个单独的内存地址空间,所以如果一个进程写入他的内存,兄弟进程就看不到变量的变化。

要在不同进程之间交换数据,您应该引用 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/

相关文章:

javascript - 如何将电子邮件添加到 Stripe 自定义收据表单(错误 : Received unknown parameter: email)

python - 如何找到错误,执行退出序列(Python,opencv,Ubuntu)后程序崩溃

c - 在应用 OpenCV 的 Viola-Jones 方法进行人脸检测之前,我应该考虑哪些预处理图像技术?

python - 多处理 apply_async() 在 Ubuntu 上不起作用

使用 Kill 进程进行 Python 测试

python - 重复将值写入现有文件

opencv - 如何访问 CV_32F/CV_64F Mat 的像素值?

python - 对传递给函数的列表进行多重处理

python - 将多重处理应用于 pandas 数据框中独特条目类别的最有效方法是什么?

python - 创建循环程序以将值应用于 pandas df