我们有一个 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% 指望写入我们的数据库,因此我们更喜欢检查系统中线程的状态。>
答案 0 :(得分:0)
原来我们没有看到线程的原因是我们使用了 gunicorn 和 multi worker。
线程是在 4 个已配置的工作程序之一上启动的,而状态 api 调用可能已由 4 个工作程序中的任何一个处理。只有当它由也负责运行线程的工作人员处理时 - 我们能够在枚举输出中看到它