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

时间:2021-01-24 13:37:08

标签: python-3.x multithreading sleep

我们有一个 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)

当我们在 debug 中运行并打印 "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 个答案:

答案 0 :(得分:0)

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

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

相关问题