スクリプトで 2 つの個別のプロセスを実行しています。最初のプロセス p1 は、正確に 1 秒で実行される oneSecondTimer ルーチンを開始し、いくつかの作業を行います。2 番目のプロセス p2 は、キーボードをリッスンするキーボード リスナーを起動します。
現時点では、ユーザーがエスケープ キーを押したときに p1 プロセスを停止したいと考えています。グローバル変数を使用しようとしましたが、うまくいきませんでした。キューを使用してみましたが、うまくいきましたが、間違いなく最もエレガントなソリューションではありません。実際には、スケールアップしない醜い回避策です。
最終的に、スクリプトには、さまざまなキーを押すことによって (開始/停止だけでなく) 制御される多数の個別の並列プロセスが含まれます。これがコードです。
import time
from pynput import keyboard
from multiprocessing import Process, Queue
def on_release(key):
if key == keyboard.Key.esc:
print('escaped!')
# Stop listener
return False
def keyboardListener(q):
with keyboard.Listener(on_release=on_release) as listener:
listener.join()
print('Keybord Listener Terminated!!!')
# Make the queue NOT EMPTY
q.put('Terminate')
def oneSecondTimer(q):
starttime = time.time()
# Terminate the infinite loop if
# queue is NOT EMPTY
while (not q.qsize()):
print("tick")
time.sleep(1.0 - ((time.time() - starttime) % 1.0))
return False
if __name__ == '__main__':
q = Queue()
p1 = Process(target=oneSecondTimer, args=(q,))
p1.start()
p2 = Process(target=keyboardListener, args=(q,))
p2.start()