我需要运行一次 X 线程,如果 X 线程仍在运行,则停止生成新线程。例如,假设我的线程是从名为 start_my_thread() 的函数中启动的。
start_my_thread() 为 kline_func 启动一个线程,该线程从远程服务器监听,并且假设没有发生网络中断,则无限期运行。
def kline_func(): ... ... ... while True: pass def start_my_thread(): kline_thread = Thread(target = kline_func) kline_thread.start() start_my_thread() # first call start_my_thread() # second call start_my_thread() # third call
我的问题是,无论我调用 start_my_thread() 多少次,如何确保 kline_thread.start() 只被调用一次。换句话说,每当我们调用 start_my_thread() 时,我都想检查我们是否有一个正在运行的 kline_thread 线程。如果没有,则触发 kline_thread.start()。如果我们已经运行了 kline_thread,则不要触发 kline_thread.start()。
我正在使用 Python3.x。
您可以使用threading.enumerate()函数,如文档中所述:
threading.enumerate()
返回当前活动的所有 Thread 对象的列表。该列表包括由 current_thread() 创建的守护线程和虚拟线程对象。它不包括已终止的线程和尚未启动的线程。但是,主线程始终是结果的一部分,即使已终止
我们在初始化Thread对象时设置线程名称
def kline_func(): ... ... ... while True: pass def start_my_thread(): thread_names = [t.name for t in threading.enumerate()] if "kline_thread" not in thread_names: kline_thread = Thread(target = kline_func, name="kline_thread") kline_thread.start() start_my_thread() # first call start_my_thread() # second call start_my_thread() # third call