FastAPI是PythonWeb领域非常流行的一个框架。目前,GitHub上有39.1kstars,远超Djangorestframework(22.3kstars)。Celey是最流行的异步任务框架,常用于数据挖掘、机器学习等计算密集型任务场景。如果需要通过API异步调用任务,两个框架可以协同工作。本文将分享如何让FastAPI和Celery更好的配合,以及如何在开发环境下让两者一条命令协同工作。0.安装依赖pipinstallfastapiceleryuvicorn1。写一个纯celery任务首先让我们写一个纯celery任务让它正常运行,然后通过fastapi调用。假设你的机器已经安装了Python3和celery,机器上已经启用了redis,运行在6379端口。现在我们来写一个简单的任务:计算两个数的和,文件名:celery_app.py代码如下:#!/Users/aaron/py38env/bin/python#filename:celery_app.pyfromceleryimportCeleryapp=Celery("tasks",broker='redis://127.0.0.1:6379/0',backend='redis://127.0.0.1:6379/0')@app.taskdefadd(x,y):返回x+y,启动worker接收远程调用。celery-Acelery_appworker-linfo如果我们要远程异步调用这个add函数,需要另外写一个文件start_celery_app.py,内容如下:fromcelery_appimportadd#导入我们的任务函数addimporttimeresult=add.delay(12,12)#异步调用,这一步不会阻塞,程序会立即运行下去whilenotresult.ready():#循环检查任务是否完成print(time.strftime("%H:%M:%S"))time.sleep(1)print(result.get())#获取任务的返回结果print(result.successful())#判断任务是否执行成功任务返回result24,命令成功完成,信息添加到worker接口如下:2.通过fastapi执行写一个api.py通过接口调用上面的add函数:fromfastapiimportFastAPIimportcelery_appapp=FastAPI()@app.get("/")defread_root():result=celery_app.add.delay(12,12)return{"12+12":result.get()}启动服务:uvicornapi:app--host0.0.0.0--port8000--reload然后访问:http://127.0.0.1:8000,你会发现任务执行成功了:于是我们启动了两个独立的进程,一个是celery的worker,另一个是fastapi的应用程序。这样做是没有问题的,严格要求在生产环境中单独运行。但是在开发环境中这样做效率太低了。3.开发环境中如何启动一个命令如果不用两个终端启动两个命令,我们可以使用Celery提供的testutility在后台线程启动celeryworker,比如写这样一个文件run.py,内容如下)uvicorn____callback==main.backif"__main__":uvicorn.main()这样只需要执行一条命令就可以同时启动celeryworker和fastapi接口服务。调试的时候是不是很方便:图末,这篇文章分享了fastapi和celery是如何协同工作的。并分享了一个开发环境的脚本,可以一条命令启动celeryworker和fastapi。它可能不是一个完美的解决方案,但它确实提高了开发效率。我认为这是值得的。如果对您有帮助,请点赞、观看、关注,感谢阅读。本文转载自微信公众号“Python7号”,可通过以下二维码关注。转载本文请联系Python七号公众号。
