首页 > 解决方案 > python3 - 睡眠时枚举结果中缺少线程

问题描述

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

线程正在执行的函数可能会或可能不会休眠一段时间。

当我们创建线程时,我们覆盖了模块提供的默认名称并添加了我们生成的线程 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_threads”的值时,我们只能在线程休眠期间看到 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% 指望写入数据库,因此我们更愿意检查系统中的线程状态。

标签: python-3.xmultithreadingsleep

解决方案


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

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


推荐阅读