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 - 睡眠时枚举结果中缺少线程的主要内容,如果未能解决你的问题,请参考以下文章