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

时间:2018-04-15 00:42:20

标签: python opencv

我制作了一个神经网络(不幸的是,它变得越来越复杂,变得非常耗费CPU),可以实时分析屏幕截图。

我希望在按下字母“a”时暂停它,并在再次按下字母“a”时取消暂停。暂停它的最有效方法是什么(不完全打破循环)?

它使用Python OpenCV库,但我不使用cv2.imshow,因此我不能使用cv2.Waitkey。我在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... 

1 个答案:

答案 0 :(得分:2)

使用Python标准库中signal packagesigwaitsigwait无法在Windows上运行。

修改

您可以使用threading library以独立于平台的方式执行您想要的操作。这是一个简短的示例程序(如果您在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函数,它将等待用户输入。如果键入alistener线程将告诉count线程暂停并打印出当前计数。您可以再次输入a以恢复计数,也可以输入e退出。