如何实现API,该API将使用POST请求中的数据运行python脚本



我想运行一个python脚本,它基本上监视特定目录发生的任何更改(要监视的目录作为POST请求的一部分传递(。每次调用API(我使用的是FastAPI(时,都必须启动脚本的一个新实例来监视该特定目录并发送回一个;成功;如果脚本成功启动,则将消息作为响应。此外,我计划添加另一个API端点,该端点将停止正在运行以监视目录的脚本。

像RQ或Celery这样的消息队列可以用来实现这一点吗?请注意,我希望每次调用API时都启动新的脚本,这样脚本的多个实例应该同时运行。我正在使用看门狗模块来监控文件系统。

我不知道如何以正确的方式做到这一点,但到目前为止,我已经想出了这样的方法,即为每个API调用创建一个新线程:

from fastapi import FastAPI
from schemas import Data # pydantic schema model for API
from threading import Thread
import filewatcher # the script that has to be run
@app.post('/register/event')
def register_watchdog(data: Data):
th = Thread(target=filewacther.create_watchdog, args=(data))
th.start()
return {"status": "success"}

实现这一目标的最佳方式是什么?还有一个问题是,我可以将脚本实现为可以在后台运行的Linux服务吗?

事实上,如果您需要返回目录浏览函数的结果,那么在代码中调用此函数是非常简单的。

...
def register_watchdog(data: Data):
return {"result": filewacther.create_watchdog(data)}

但是,如果您想在后台运行一些耗时的过程,您确实应该对工作人员使用AMQP。带有Celery的RabbitMQ确实是正确的选择,它将使您的系统易于扩展。

实现这一目标的最佳方法是什么?还有一个问题是,我可以将脚本实现为可以在后台运行的Linux服务吗?

是的,您确实可以在后台将RabbitMQ与Celery一起作为linux服务运行,例如使用supervisor(示例(,但这不是最佳做法。查看系统中容器化元素的方向。您可以将Celery封装在Docker中,并使其与AMQP服务和web应用程序一起运行变得足够简单(示例(。

最新更新