Python 全栈系列253 再梳理flask-celery的搭建

说明

最近做了几个实验,将结论梳理一下,方便以后翻看。

  • 1 flask-celery 主要用于数据流的同步任务,其执行由flask-aps发起,基于IO并发的方法,达到资源的高效利用,满足业务上的需求。
  • 2 目前部署环境有算网机和anygpu

内容

1 环境

现在看起来,将flask-celery部署在宿主机上是可行的,一般来说我会先安装miniconda3,有些容器本身就已经是anaconda3的就不动了。

apt的升级是可选的

sudo apt update
sudo apt upgrade -ywget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh~/miniconda3/bin/conda initsource ~/.bashrcconda 24.4.0which conda
/root/miniconda3/bin/conda

然后,一般就在base环境下安装包,如果本身已经是容器环境(租用机有些不允许再安装软件),就直接安装相关python3包

pip3 install ipython -i https://mirrors.aliyun.com/pypi/simple/
pip3 install requests -i https://mirrors.aliyun.com/pypi/simple/
wget -NO Basefuncs-1.10-py3-none-any.whl http://YOURS/downup/view008_download_from_folder/pys.Basefuncs-1.10-py3-none-any.whl
pip3 install Basefuncs-1.10-py3-none-any.whl
pip3 install clickhouse_driver -i https://mirrors.aliyun.com/pypi/simple/
pip3 install pandas -i https://mirrors.aliyun.com/pypi/simple/
pip3 install numpy -i https://mirrors.aliyun.com/pypi/simple/
pip3 install redis -i https://mirrors.aliyun.com/pypi/simple/
pip3 install pydantic -i https://mirrors.aliyun.com/pypi/simple/
pip3 install nest_asyncio -i https://mirrors.aliyun.com/pypi/simple/
pip3 install aiohttp -i https://mirrors.aliyun.com/pypi/simple/
pip3 install Flask -i https://mirrors.aliyun.com/pypi/simple/
pip3 install Flask-APScheduler -i https://mirrors.aliyun.com/pypi/simple/
pip3 install celery -i https://mirrors.aliyun.com/pypi/simple/
pip3 install gunicorn -i https://mirrors.aliyun.com/pypi/simple/
pip3 install mongoengine -i https://mirrors.aliyun.com/pypi/simple/
pip3 install apscheduler -i https://mirrors.aliyun.com/pypi/simple/
pip3 install tornado -i https://mirrors.aliyun.com/pypi/simple/
pip3 install Pillow -i https://mirrors.aliyun.com/pypi/simple/
pip3 install markdown -i https://mirrors.aliyun.com/pypi/simple/
pip3 install pymysql -i https://mirrors.aliyun.com/pypi/simple/
pip3 install gevent -i https://mirrors.aliyun.com/pypi/simple/
pip3 install akshare -i https://mirrors.aliyun.com/pypi/simple/

接下来需要在指定位置创建文件

  • 1 如果是在算网机,那么直接拉取项目文件,一般放在 /opt/project_notes/flask_celery 下面
  • 2 如果是在租用机,一般建立在/opt/flask_celery 下面,采用vim + 拷贝的方式
systemd

一般在宿主机级别可以有这个服务的控制,但是很多算力机也是没有的,只租用容器(怎么有种卖艺不卖身的感觉 - - !)。
如果没有systemd,那么就需要切到对应目录下,直接用后台启动的方式

直接用命令启动的方式,切换到对应目录下

cd  /opt/project_notes/flask_celery 
或
cd /opt/flask_celeryvim server_single_v2.py
# 如果采用了非标的redis配置,需要到程序里面修改一下地址
celery_broker = 'redis://:YOURS@127.0.0.1:24008/1'# 前台启动命令
gunicorn server_single_v2:app -b 0.0.0.0:24104
celery -A server_single_v2.celery_ worker

写的时候刚打开,一堆积压的任务立即扑面而来。
在这里插入图片描述
我突然意识到celery的异步可能是线程级,而不是协程级的。(因为worker编号看起来很像我的cpu核数编号)
在这里插入图片描述
算了,先放过自己 。用一段时间看看,之后可以自己创建一个协程级的服务来进行流转和调度。我主要的应用应该就是在于异步请求API。我想以后有一块很大的改造就是将取数/查询部分的服务都使用异步进行优化。可以参考tornado同步转异步几种方式,先从搭建异步tornado开始。

编辑启动脚本vim ~/start_flask_celery.sh。理论上需要source才能activate,虽然即使不activate也可以运行,但我猜主要是因为在服务里面写了conda环境,所以默认进入了base。

#!/bin/bash
# 激活 base 环境(或你创建的特定环境)
source /root/miniconda3/etc/profile.d/conda.sh
conda activate base#!/bin/bash
#anaconda环境# 运行 Python 服务脚本
# 算网机
cd /opt/project_notes/flask_celery 
# 租用机
# cd /opt/flask_celerynohup gunicorn server_single_v2:app -b 0.0.0.0:24104 >/dev/null 2>&1 &
nohup celery -A server_single_v2.celery_ worker >/dev/null 2>&1 &

如果没有systemd,那么就开机的时候手动执行一下脚本,一般还是尽量注册为systemd服务,注意一下两种不同环境的配置。
先修改脚本执行权限 chmod +x ~/start_flask_celery.shvim /lib/systemd/system/flask_celery.service

[Unit]
Description=flask_celery_service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target[Service]
#启动服务的命令
Type=forking
ExecStart=/root/start_flask_celery.sh
Restart=always
RestartSec=5
# miniconda
Environment="PATH=/root/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# anaconda
#Environment="PATH=/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"[Install]
WantedBy=multi-user.target

然后配置重载、启动和自启动

systemctl daemon-reload
systemctl start flask_celery
systemctl enable flask_celery
systemctl status flask_celery┌─root@m7:~
└─ $ systemctl status  flask_celery
● flask_celery.service - flask_celery_serviceLoaded: loaded (/lib/systemd/system/flask_celery.service; enabled; vendor preset: enabled)Active: active (running) since Sat 2024-06-15 13:03:51 CST; 1s agoProcess: 428 ExecStart=/root/start_flask_celery.sh (code=exited, status=0/SUCCESS)Tasks: 38 (limit: 4915)CGroup: /system.slice/flask_celery.service├─475 /root/miniconda3/bin/python /root/miniconda3/bin/gunicorn server_single_v2:app -b 0.0.0.0:24104├─476 /root/miniconda3/bin/python /root/miniconda3/bin/celery -A server_single_v2.celery_ worker├─556 /root/miniconda3/bin/python /root/miniconda3/bin/gunicorn server_single_v2:app -b 0.0.0.0:24104├─864 /root/miniconda3/bin/python /root/miniconda3/bin/celery -A server_single_v2.celery_ worker├─924 /root/miniconda3/bin/python /root/miniconda3/bin/celery -A server_single_v2.celery_ worker├─949 /root/miniconda3/bin/python /root/miniconda3/bin/celery -A server_single_v2.celery_ worker└─975 /root/miniconda3/bin/python /root/miniconda3/bin/celery -A server_single_v2.celery_ worker615 13:03:51 m7 systemd[1]: Starting flask_celery_service...
615 13:03:51 m7 systemd[1]: Started flask_celery_service.

测试

import requests as req para_dict = {'arg1':111,'arg2':222}resp = req.post('http://127.0.0.1:24104/sum_post/',json = para_dict )
print('每个任务耗时10秒')
import time 
tick1 = time.time()
print(req.get('http://127.0.0.1:24104/get_result/%s' % resp.text).text)
tick2 = time.time()
print('actually takes %.2f' % (tick2 - tick1 ))每个任务耗时10333
actually takes 10.02

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯大模型最新路线图,主打一个“实用”

让大模型更接地气,腾讯交出一份阶段性答卷。 大模型狂奔一年多后,正迈向产业落地的深水区。如何用好这一革命性的新技术,已成为整个社会的一道必答题。 去年,国内大模型百花齐放,外界关注的焦点也集中在模型能力上。…

AI Agent智能应用从0到1定制开发(完结)

在数字化时代的浪潮中,人工智能(AI)代理智能应用如同星辰般璀璨,引领着技术革新的潮流。从零开始定制开发一款AI Agent智能应用,就像是在无垠的宇宙中绘制一颗新星的轨迹,每一步都充满了挑战与创新的火花。…

echarts写某个市地图

const geoJSON {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":440303,"name":"罗湖区","center":[114.123885,22.555341],"…

【2024最新精简版】MyBatis面试篇

文章目录 mybatis内部实现过程mybatis延迟加载请说说MyBatis的工作原理mybatis接口里的方法,参数不同时能重载吗mybatis分页插件的原理是什么?mybatis的一级、二级缓存👍mybatis如何实现多表查询mybatis如何实现批量插入👍mybatis动态SQL标签…

关于使用pycharm中控制台运行代码错误之FileNotFoundError: [Errno 2] No such file or directory:

在使用pycharm环境下复现《python编程:从入门到实践》这本书第16.1.1内容中分析csv文件头一节的代码时出现如下问题: 1、文章中使用的数据来源问题 直接参考本站Kenny C同学的文章提供内容即可。 https://github.com/kenidi8215/Hello-World 打开网页&a…

Java面试题--JVM大厂篇之掌握JVM性能优化:选择合适的垃圾回收器

掌握JVM性能优化:选择合适的垃圾回收器 引言: ​  在Java开发中,性能优化往往是提高应用稳定性和用户体验的关键所在。而垃圾回收器的选择和优化,是JVM性能调优的核心环节。如何在众多垃圾回收器中选出适合自己应用需求的那一个&#xff1…

Docker笔记-Debian容器内搭建ssh服务

登陆容器之后修改密码: passwd 密码设置完成后安装openssh-server apt-get install openssh-server 修改端口号为50022并添加配置 vim /etc/ssh/sshd_config 修改成 Port 50022 PasswordAuthentication yes PermitRootLogin yes 启动 rootlinux:~# /etc/in…

cve_2017_12635-CouchDB垂直权限绕过

1.采用参考 https://www.cnblogs.com/mlxwl/p/16577781.html vulfocus:Vulfocus 漏洞威胁分析平台 2.产生原因 在2017年11月15日,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同&#…

STM32实现多级菜单界面显示

1、main函数中,while循环之前 MenuStruct menu[30] //定义多级菜单结构体数组{{0,0,0,1,show0}, //第一个元素表示索引号,第二个元素表示该按键按下后要返回的界面,第三个元素表示该按键按下后要切换的菜单条目界面,第四个元素…

React中Hooks--useEffect | useState | useCallback | useMemo

一、useEffect useEffect 是 React 提供的一个 Hook,用于在函数组件中执行副作用操作(side effects),例如数据获取、订阅、或手动更改 DOM 等。useEffect 相当于类组件中的生命周期方法,但是它提供了更多的灵活性。 …

照明灯具哪个品牌好,一文详细带你了解照明灯具种类有哪些

在孩子学习过程中,有一样物品的重要性不容忽视,那就是一盏提供舒适光源的照明灯具。那么照明灯具哪个品牌好?面对不断增加的学业负担,孩子们经常需要在夜晚借助台灯的光亮进行学习,这已经成为了家庭生活中普遍的情景。…

Vue34-销毁流程

一、销毁流程预览 二、vm.$destroy()函数的调用,开始销毁流程 一个应用只有一个vm,但是一个vm会管理一堆组件实例对象(和vm很像:微型的vm)。 销毁流程中解绑的事件监听器,是自定义事件,不是原…

uni app 自定义 带popup弹窗的input组件

工作需要。自定义了个带popup弹窗的input组件。此组件满足个人需求&#xff0c;不喜勿喷。应该可以看明白怎么回事&#xff0c;也能自己改改&#xff0c;所以就不要联系了&#xff0c;点赞收藏就好 <template><view class"dialog_main"><input v-mod…

Mantis-ML 2.0识别基因-疾病关联,Beam Pro实现无需后期的AR视频拍摄与三维空间应用

一支烟花官网&#xff1a; https://agifun.love 智源社区 Sci. Adv. | 治疗性遗传靶点的全表型识别 DRUGAI今天为大家介绍的是来自Dimitrios Vitsios团队的一篇论文。人类基因组数据集的持续扩展推动了治疗靶点的识别&#xff0c;然而&#xff0c;从基因注释中提取基因-疾病…

这份简历让一位程序员在谷歌获得30万美元

大家好&#xff0c;我是弗雷。每次都在让大家尝试走出职场&#xff0c;但今天我们却选择再次走进职场。 作为曾经的职场人&#xff0c;我深深明白简历的敲门砖作用&#xff0c;制作一份优质的简历至关重要。 你所见过的最优秀的简历是什么样子&#xff1f; 或者你想象中最优秀…

商业银行和投资银行有什么区别?

商业银行和投资银行在业务性质、服务对象、风险管理等方面有显著区别。以下是两者的主要区别及相关的历史背景&#xff1a; 中文版 商业银行&#xff08;Commercial Bank&#xff09; 主要功能 存款业务&#xff1a;吸收公众存款&#xff0c;并为存款人提供安全的存款服务。…

Superset二次开发之调研篇 v3.0 VS v4.0

功能变化(v3.0 与 v4.0)参考releases 在 Superset 官方版本升级过程中,对源码进行了大量修改。这不仅解决了许多安全问题,减少了漏洞,还显著增强了系统的稳定性和安全性。同时,废弃了旧的可视化图表和许多不再使用的功能,也引入了众多新的用户体验和改进之处。关注版本…

vscode创建一个jest测试框架的项目

在Visual Studio Code (VSCode) 中创建一个用于单独测试JavaScript方法的项目相对简单。以下是一步步指导&#xff1a; ### 1. 创建项目文件夹 首先&#xff0c;在你的电脑上选择一个合适的位置创建一个新的文件夹&#xff0c;这将作为你的项目目录。 ### 2. 打开VSCode并设置项…

chatgpt的命令词

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

TypeScript 学习笔记(二十二):TypeScript 与微服务架构的结合使用

TypeScript 学习笔记&#xff08;二十二&#xff09;&#xff1a;TypeScript 与微服务架构的结合使用 1. 引言 在前几篇学习笔记中&#xff0c;我们探讨了 TypeScript 的基础知识、前后端框架的结合应用、性能优化、前端架构设计、工具和生态系统&#xff0c;以及 TypeScript…