2

私は2つのプログラムを持っています program1.py は、ユーザーからコマンドを取得するコマンドラインインターフェイスのようなものです program2.py には、コマンドに従って関連プログラムを実行するプログラムがあります。

プログラム 1 には quit_program() モジュールもあります 私たちの単純な宇宙では.. 1 つのコマンドと 1 つのプログラムしかないとしましょう。

program1.py

def main():
   while True:
        try:

            command = raw_input('> ')
            if command == "quit" :
                return

            if command == '':
                continue
        except KeyboardInterrupt:
            exit()

        parseCommand(command)

そして、私は持っています:

 if commmand == "hi":
       say_hi()

現在、program2 は

   def say_hi():
      #do something..

現在、2 つのケースが考えられます...どちらの場合でも問題なく say_hi() が完了します...しかし、私が望むのは、ユーザーがコマンドを入力すると (たとえば: end)、この say_hi() が途中で終了することです..

しかし、私の現在の実装は非常に順次的です..つまり、実行が完了するまで端末に何も入力できないということです..somethng は、say_hi() を別のスレッドで実行する必要があることを教えてくれますか?

私はこれについてまっすぐに考えることができません。助言がありますか?ありがとう

4

1 に答える 1

12

threading モジュールは、あなたが探しているものです。

import threading
t = threading.Thread(target=target_function,name=name,args=(args))
t.daemon = True
t.start()

この.daemonオプションにより、アプリの終了時にスレッドを明示的に強制終了する必要がなくなります...そうしないと、スレッドは非常に厄介になる可能性があります

この質問とコメントの質問に固有のsay_hi関数は、別のスレッドで次のように呼び出すことができます。

import threading
if commmand == "hi":
   t = threading.Thread(target=say_hi, name='Saying hi') #< Note that I did not actually call the function, but instead sent it as a parameter
   t.daemon = True
   t.start() #< This actually starts the thread execution in the background

補足として、スレッド内でスレッドセーフ関数を使用していることを確認する必要があります。こんにちはと言う例では、print() の代わりに logging モジュールを使用したいと思うでしょう。

import logging
logging.info('I am saying hi in a thread-safe manner')

詳細については Python Docs を参照してください。

于 2013-02-08T23:18:35.690 に答える