4

しばらく実行した後に終了するプログラムを実装したいtのですが、tを使用してコマンドラインから読み取りますArgumentParser。現在、私は次のコードを持っています(詳細を省略):

def run():
    parser = create_arg_parser()
    args = parser.parse_args()
    class_instance = MultiThreadClass(args.arg1, args.arg2)
    class_instance.run()

if __name__ == '__main__':
    run_thread = Thread(target=run)
    run_thread.daemon = True
    run_thread.start()
    time.sleep(3.0)

プログラムは期待どおりに動作します (3 秒間実行すると終了します)。しかし、前に述べたように、実行時間 (上記のコード スニペットの 3.0) は、ハード コードするのではなく、コマンド ラインから入力する必要があります (例: args.arg3 = 3.0)。どうやら私はtime.sleep(args.arg3)直接置くことはできません。私の問題を解決できるアプローチがあるかどうか疑問に思っていましたか? デーモンスレッドを使わない回答も大歓迎です!ありがとう。

PS。引数解析コードを次のrunように関数の外に置くと:

def run(args):
    class_instance = MultiThreadClass(args.arg1, args.arg2)
    class_instance.run()

if __name__ == '__main__':
    parser = create_arg_parser()
    args = parser.parse_args()
    run_thread = Thread(target=run(args))
    run_thread.daemon = True
    run_thread.start()
    time.sleep(args.arg3)

プログラムはargs.arg3数秒後に終了せず、その理由について混乱しています。また、これらすべての背後にある魔法を説明できる人がいれば、非常に感謝しています...どうもありがとう!

4

1 に答える 1

1

2 番目の例では、作成時Threadに関数のみを渡す必要があり、args は 2 番目の引数として指定する必要があります。このような:

Thread(target=run, args = (args.arg1, args.arg2))

Noneしたがって、2番目の例では、スレッドを作成してrun関数からThreadクラスに戻る前に、実際に関数を評価します。

また、docsによると、次を指定する場合daemon = True

このフラグの意味は、デーモン スレッドだけが残ったときに Python プログラム全体が終了することです。

これはうまくいくはずです:

def run(arg1,arg2):
    class_instance = MultiThreadClass(arg1, arg2)
    class_instance.run()

if __name__ == '__main__':
    parser = create_arg_parser()
    args = parser.parse_args()
    run_thread = Thread(target=run, args=(args.arg1, args.arg2))
    run_thread.start()
    time.sleep(args.arg3)

この投稿は、スレッドを使い始めるのに役立ちます。さらに、「魔法」をよりよく理解するためにドキュメントを読んでください。

于 2015-04-26T05:16:47.977 に答える