1

スクリプトで 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()
4

1 に答える 1