【发布时间】:2017-01-10 20:25:54
【问题描述】:
我在 Windows 上使用 Python 3.5.2。
我想运行一个 python 脚本,但保证不会超过 N 秒。如果 确实 花费了超过 N 秒,则应该引发异常,并且程序应该退出。最初我以为我可以在开始时启动一个线程,在抛出异常之前等待 N 秒,但这只会向计时器线程抛出异常,而不是向父线程抛出异常。例如:
import threading
import time
def may_take_a_long_time(name, wait_time):
print("{} started...".format(name))
time.sleep(wait_time)
print("{} finished!.".format(name))
def kill():
time.sleep(3)
raise TimeoutError("No more time!")
kill_thread = threading.Thread(target=kill)
kill_thread.start()
may_take_a_long_time("A", 2)
may_take_a_long_time("B", 2)
may_take_a_long_time("C", 2)
may_take_a_long_time("D", 2)
这个输出:
A started...
A finished!.
B started...
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files\Python35\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Program Files\Python35\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "timeout.py", line 11, in kill
raise TimeoutError("No more time!")
TimeoutError: No more time!
B finished!.
C started...
C finished!.
D started...
D finished!.
这甚至是遥不可及的吗?我意识到我可以这样做:
import threading
import time
def may_take_a_long_time(name, wait_time, thread):
if not thread.is_alive():
return
print("{} started...".format(name))
time.sleep(wait_time)
print("{} finished!.".format(name))
def kill():
time.sleep(3)
raise TimeoutError("No more time!")
kill_thread = threading.Thread(target=kill)
kill_thread.start()
may_take_a_long_time("A", 2, kill_thread)
may_take_a_long_time("B", 2, kill_thread)
may_take_a_long_time("C", 2, kill_thread)
may_take_a_long_time("D", 2, kill_thread)
但是,例如,如果调用了may_take_a_long_time("B", 60, kill_thread),则此方法会失败。
所以我想我的 TL;DR 问题是,对主线程本身设置时间限制的最佳方法是什么?
【问题讨论】:
-
你根本不能杀死 Python 线程。只是没有API。而您在代码中所做的只是在一个新线程中引发一个异常,这不会影响主线程。
-
时间限制的目的是什么?如果您不想等待某件事发生超过一定时间,您只需停止等待。
-
@ForceBru 我知道它不会影响主要的,那是我的问题。这是我最初的幼稚实现。我正在尝试找出如何确保一系列函数 (
may_take_a_long_time) 花费的时间不超过 N 秒。
标签: python multithreading time