首页 > 解决方案 > fastAPI 管理具有后台任务的工作人员

问题描述

我正在使用具有一些特殊性的 FastAPI 后端...让我首先解释一下该应用程序的通常工作流程:

  1. 用户介绍要跟踪的系统的 IP。
  2. 后端接收它并创建一个对象(类的实例),该对象在 FastAPI BackgroundTasks 中启动一个循环(典型的运行方法),以将数据定期存储在数据库中。
  3. 当用户想要停止跟踪该系统时,只需单击“停止”。所以后端完成了那个循环,BackgroundTasks 结束了。

由于它应该是一个小型应用程序,因此存储在 pythons 全局字典中的对象如下所示:

{
 "X.X.X.X": new Handler (a new instance of the class),
 "Y.Y.Y.Y": new Handler,
 ...
}

我可以很容易地抓住物体来控制它们。

问题是我正在跟踪更多的系统并且系统开始变慢。所以我决定使用workersuvicorn 的选项来看看我是否可以解决这个问题(例如,有 4 个进程和 6 个线程)。但是,当 Uvicorn 启动 num_workers newmultiprocessing.Process并且请求由其中一个响应时,您可能在全局 dict 中找不到对象(毕竟进程不是线程......)。

所以我尝试使用 multiprocessing.managers.SyncManager 并“创建”一种缓存。但是,当我尝试存储对象实例时,它说cannot pickle '_thread.lock' object。我不太确定是否不能做我想做的事或什么......(在多个工作人员之间共享 python 对象

我也尝试了 aiocache 我正在创建缓存的新实例,所以也没有工作。

我也尝试过使用 guvicorn 和--preloadcmd 选项,但结果相同......

我不知道是否可以使用中间件进行某种路由,因此我可以搜索哪个进程在其字典中具有所需的 IP 对象或类似的东西......

总之,我在征求意见......我该如何处理这个问题?

PD:很抱歉这么长的文字!

谢谢!!

标签: pythonwebpython-multiprocessingfastapi

解决方案


推荐阅读