我一直在后臺撰寫視頻錄制解決方案(cv2 使用)以執行一些操作,然后停止錄制。cv2 lib 提出了通過捕獲鍵盤中斷來中斷錄制的解決方案:
while True:
ret,frame= cap.read()
writer.write(frame)
cv2.imshow('frame', frame)
# waiting for any key pressed
if cv2.waitKey(1) & 0xFF == 27:
break
但我想將此流程拆分為兩種方法:start() 和 stop()。因為我需要在 start() 和 stop() 之間執行一些操作,所以我選擇了多處理庫。
import time
from multiprocessing import Process
class Recorder:
terminator = 0
proc = None
def func(self):
while self.terminator == 0:
print('func')
time.sleep(1)
if self.terminator == 1:
break
def start(self):
self.proc = Process(target=self.func(), args=())
self.proc.start()
def stop(self):
self.terminator = 1
self.proc.join()
if __name__ == '__main__':
test = Recorder()
test.start()
time.sleep(5)
test.stop()
但據我了解,變數重新分配不會影響呼叫子行程的函式內部的回圈。
將重新分配的變數傳遞給子行程是否有任何解決方案,或者有另一種解決問題的方法?
使變數“全域”沒有幫助。
uj5u.com熱心網友回復:
您可以為此使用 multiprocessing.Event 。
https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Event
只需用它替換您的終止符 int 標志:
import time
from multiprocessing import Event, Process
class Recorder:
def __init__(self):
self.proc = None
self.terminator = Event()
def func(self):
while not self.terminator.is_set():
print('func')
time.sleep(1)
def start(self):
self.proc = Process(target=self.func, args=())
self.proc.start()
def stop(self):
self.terminator.set()
self.proc.join()
if __name__ == '__main__':
test = Recorder()
test.start()
time.sleep(5)
test.stop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506596.html