【问题标题】:Python: terminate a multithreading program after some time using daemon threadPython:使用守护线程一段时间后终止多线程程序
【发布时间】:2015-04-26 04:43:14
【问题描述】:

我想实现一个在运行一段时间后终止的程序t,并使用ArgumentParser从命令行读取t。目前我有以下代码(省略一些细节):

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 秒后终止)。但正如我之前提到的,运行时间(上面代码 sn-p 中的 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 秒后终止,我对原因感到困惑。如果有人能解释所有这些背后的魔力,我也将非常感激......非常感谢!

【问题讨论】:

  • 答案没有帮助吗?

标签: python multithreading daemon python-daemon


【解决方案1】:

在您的第二个示例中,当创建 Thread 时,您应该只传递函数,并且 args 应该作为第二个参数。像这样:

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

因此,在第二个示例中,您实际上是在创建线程并将 Nonerun 函数返回到 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)

This 帖子将帮助您开始使用 Threads,此外我会阅读 docs 以更好地了解“魔法”。

【讨论】: