python3 -线程处于睡眠状态时枚举结果中缺少线程



我们有一个启动线程的API端点,以及另一个检查线程状态的端点(基于第一个API调用返回的线程ID)。我们使用threading模块。

线程正在执行的函数可能在一段时间内休眠,也可能不休眠。

当我们创建线程时,我们覆盖模块提供的默认名称,并添加由我们生成的线程ID(以便我们可以跟踪)。

状态端点从客户端请求获取线程ID,并简单地循环threading.enumerate()的结果。当线程运行而不是睡眠时,我们看到该线程由threading.enumerate()函数返回。当它在睡觉的时候,它不是。

查看线程是否处于活动状态的函数:

def thread_is_running(thread_id):
all_threads = [ t.getName() for t in threading.enumerate() ]
return any(thread_id in item for item in all_threads)

当我们在调试中运行并打印&;all_thread &;的值时,我们只在线程的睡眠时间看到MainThread线程。一旦休眠结束,我们就会在"all_threads"的值中看到我们的线程。

我们是这样启动线程的:

thread_id = random.randint(10000, 50000)
thread_name = f"{service_name}-{thread_id}"
threading.Thread(target=drain, args=(service_name, params,), name=thread_name).start()

是否有一种方法来获得所有线程的列表,包括空闲线程?正在睡觉的线程是否被标记为空闲?是否有更好的方法来暂停线程?

我们考虑过让线程更新它在数据库中的状态,但是由于我们目前有一些内部问题,我们不能100%地指望写入我们的数据库,所以我们更喜欢检查线程的状态系统

原来我们没有看到线程的原因是我们使用了gunicorn和多worker。

线程是在4个配置的工作线程之一上启动的,而状态api调用可以由4个工作线程中的任何一个处理。只有当它由同时负责运行线程的worker处理时,我们才能在枚举输出

中看到它。

最新更新