Python: 使用守护线程一段时间后终止多线程程序
Python: terminate a multithreading program after some time using daemon thread
我想实现一个程序,该程序将在 运行 后终止一段时间 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
秒后终止,我对原因感到困惑。如果有人能解释所有这些背后的魔力,我也将不胜感激……非常感谢!
在你的第二个例子中,当创建一个 Thread
时,你应该只传递函数,args 应该作为第二个参数出现。像这样:
Thread(target=run, args = (args.arg1, args.arg2))
因此,在您的第二个示例中,您实际上是在创建线程并将 None
从 run
函数返回到 Thread
class.[=20 之前评估该函数=]
另外,根据docs,指定daemon = True
时:
The significance of this flag is that the entire Python program exits
when only daemon threads are left
这应该有效:
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)
这个 post 将帮助您开始使用 Threads,此外我会阅读 docs 以更好地理解 "magic"。
我想实现一个程序,该程序将在 运行 后终止一段时间 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
秒后终止,我对原因感到困惑。如果有人能解释所有这些背后的魔力,我也将不胜感激……非常感谢!
在你的第二个例子中,当创建一个 Thread
时,你应该只传递函数,args 应该作为第二个参数出现。像这样:
Thread(target=run, args = (args.arg1, args.arg2))
因此,在您的第二个示例中,您实际上是在创建线程并将 None
从 run
函数返回到 Thread
class.[=20 之前评估该函数=]
另外,根据docs,指定daemon = True
时:
The significance of this flag is that the entire Python program exits when only daemon threads are left
这应该有效:
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)
这个 post 将帮助您开始使用 Threads,此外我会阅读 docs 以更好地理解 "magic"。