小能豆

如果线程已存在,如何避免运行新线程

py

我需要运行一次 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。


阅读 17

收藏
2024-12-31

共1个答案

小能豆

您可以使用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
2024-12-31