python3 - 睡眠时枚举结果中缺少线程

Posted

技术标签:

【中文标题】python3 - 睡眠时枚举结果中缺少线程【英文标题】:python3 - thread is missing from enumerate result when it is sleeping 【发布时间】:2021-04-28 10:57:57 【问题描述】:

我们有一个启动线程的 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% 指望写入我们的数据库,因此我们更愿意检查系统中的线程状态。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于python3 - 睡眠时枚举结果中缺少线程的主要内容,如果未能解决你的问题,请参考以下文章

将睡眠与 Pthread 一起使用时在 C 中出现分段错误

从套接字流读取时是不是需要线程睡眠?

如何在等待调用委托时让主线程进入睡眠状态?

有没有办法唤醒睡眠线程?

需要精确的线程睡眠。最大 1ms 错误

Raspbian 在睡眠时检测键盘输入