暂停 CPU 密集型 python 程序的最有效方法是什么?



我制作了一个神经网络(不幸的是,它的复杂性已经增加,并且变得相当CPU密集(,它可以实时分析屏幕截图。

我希望在按下字母"a"时暂停它

,并在再次按下字母"a"时取消暂停它。暂停它(不完全中断循环(的最有效方法是什么?

它使用Python OpenCV库,但我不使用cv2.imshow,因此我不能使用cv2。等待密钥。我正在Windows 10上运行它。你能提供你的答案的例子代码吗?下面是一些代码:

import cv2
import mss
from PIL import Image
import numpy as np
#Creates an endless loop for high-speed image acquisition...
while (True):
    with mss.mss() as sct:
        # Get raw pixels from the screen
        sct_img = sct.grab(sct.monitors[1])
        # Create the Image
        img = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
        #The rest of the neural network goes here...
        #PAUSE statement... 

使用 Python 标准库中 signal 包中的sigwaitsigwait不适用于Windows。

编辑

您可以使用threading库以独立于平台的方式执行所需的操作。下面是一个简短的示例程序(如果您在 Linux 或 Mac 上运行,则需要 py-getch 包(:

import os
from threading import Thread, Event
if os.name=='nt':
    from msvcrt import getch
elif os.name=='posix':
    from getch import getch
else:
    raise OSError
isRunning = True
def count(event):
    i = 0
    while isRunning:
        event.wait(1)
        if event.isSet() and isRunning:
            event.clear()
            print('Pausing count at %d' % i)
            event.wait()
            print('resuming count')
            event.clear()
        i += 1
def listener(event):
    # in Python, need to mark globals if writing to them
    global isRunning
    while isRunning:
        c = getch()
        if c=='a':
            event.set()
        if c=='e':
            event.set()
            isRunning = False
def main():
    pauseEvent = Event()
    pauseEvent.clear()
    listenerThread = Thread(target=listener, args=(pauseEvent,))
    listenerThread.start()
    count(pauseEvent)
if __name__=='__main__':
    main()

上面的程序将运行两个线程。主线程将运行 count 函数,该函数每秒将计数加 1。另一个线程运行 listener 函数,该函数将等待用户输入。如果键入 a ,则listener线程将告诉count线程暂停并打印出当前计数。您可以再次键入 a 以恢复计数,也可以键入 e 退出。

最新更新