0

マルチスレッド スクリプトを終了するために KeyboardInterrupt を調べた後、キーボードの上下キーを使用して、使用されているスレッドの数を増減できるかどうか疑問に思っていました。これは、いつでも発生できるように、KeyboardInterrupt と同じ方法で発生することを願っています。このようなことは可能ですか、またはこれにより適した別の方法はありますか?

def do_something(input_file, threads):
concurrent = threads
l = read_csv(input_file)

for i in range(concurrent):
    t = Thread(target=create_accounts)
    t.daemon = True
    t.start()
try:
    for account in l:
        q.put(account)
    q.join()
except KeyboardInterrupt:
    sys.exit(1)

if __name__ == '__main__':

    threads = 1
    q = Queue(threads * 2)
    do_something('test.csv', threads)
4

1 に答える 1

1

AKeyboardInterruptは特別なものです。Unix では、Python は基本的に端末が ^C をシグナルに変換できるようにし、例外を発生させるSIGINTためのシグナル ハンドラーをインストールします。SIGINTWindows ではもう少し複雑ですが、基本的な考え方は同じです。通常のキープレスはコードを中断しません。

ただし、スレッドをキーボードのリスニング専用にすることもできます。あなたのメインスレッドは何も役に立たないようです。そうであれば、その作業をバックグラウンド スレッドにキックします。その後、メインスレッドはキーボード入力を待つだけで済みます。

しかし…キーボード入力をどのように待ちますか? それはトリッキーな部分です。通常、ほとんどのプラットフォームでは、入力は行バッファリングされます。また、矢印キーには、過去のエントリの履歴を循環するなど、すでに特別な意味があります。

これは、 Windows やUnix でコンソール I/Oを使用して低レベルで行うことができ、termios文字コードに関する厄介なビジネス全体を学習して、実際に矢印キーを識別できるようにします。しかし、より高いレベルのラッパーを使用する方がはるかに簡単であることがわかるでしょう。PyGame や Qtgetchなどから、あらゆる種類の選択肢があります。consoleioPyPI を検索します。

于 2015-05-05T23:13:27.687 に答える