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

news2024/11/25 16:48:53

说明

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

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

内容

1 环境

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

apt的升级是可选的

sudo apt update
sudo apt upgrade -y

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

~/miniconda3/bin/conda init

source ~/.bashrc

conda 24.4.0

which 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_celery

vim 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_celery

nohup 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_service
   Loaded: loaded (/lib/systemd/system/flask_celery.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2024-06-15 13:03:51 CST; 1s ago
  Process: 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_ worker

615 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.coloradmin.cn/o/1827605.html

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

相关文章

餐厅点餐系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,商品管理,用户管理,店家管理,广告管理 店家账户功能包括:系统首页,个人中心,商品管理,广告管…

基于System-Verilog的流水灯设计与仿真

文章目录 一、system Verilog1.语言基本介绍2.过程赋值和连续赋值 二、编写testbench仿真1.流水灯testbench2.2位全加器3.实验结果 一、system Verilog 1.语言基本介绍 像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为,以便将其转换为由组合门…

Python中的数据可视化:绘制三维线框图plot_wireframe()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化: 绘制三维线框图 plot_wireframe() [太阳]选择题 在上面的代码中,plot_wireframe() 方法用于绘制什么类型的图形? import matplot…

无公网ip、服务器无法上网如何实现外网访问

在ipv4的大环境下,公网ip和车牌号一样抢手,一个固定公网ip价格非常昂贵,中小企业承担不起,也不愿意在上面投入;同时勒索病毒日益猖獗,企业信息化负责人为了保证数据安全性,干脆禁止服务器上外网…

LM339模块电路故障查询

最近的电路测试中出现一个问题,如果不接液晶屏,LM339输入端是高电平,如果接了液晶屏,输入端就是低电平,即使在输入端加了上拉电阻,还是如前面的结论,如果越过LM339,直接和后级电路连接&#xff…

纽约华尔街Wall Street 简介

中文版 华尔街简介 华尔街位于纽约市曼哈顿下城,是全球最重要的金融中心之一。它代表了美国的金融市场,并且是许多重要金融机构的所在地。以下是对华尔街的概述: Source: Google Map 历史背景 起源:"华尔街"这个名字…

springboot原理篇-springboot

springboot原理篇-springboot(三) 一、起步依赖 虽然我是直接学习springboot的,没有经历过使用spring开发,但是鉴于我还学习了c,对依赖这方面真的一言难尽!springboot起步依赖解决依赖问题我实在是羡慕! 直…

移动端超超超详细知识点总结(Part4)

rem基础 1. rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小。不同的是rem的基准是相对于html元素的字体大小。比如,根元素(html)设置font-size12px; 非根元素设置width:2rem;则换成px表示就是24p…

条件语句与循环结构

引言 条件语句和循环结构是C语言中构建程序逻辑的基本工具。它们允许程序根据条件执行不同的代码块和重复执行某些操作。本篇文章将详细介绍C语言中的条件语句和循环结构,包括if、else、switch语句,以及for、while、do-while循环的使用,帮助读…

【猫狗分类】Pytorch VGG16 实现猫狗分类1-数据清洗+制作标签文件

Pytorch 猫狗分类 用Pytorch框架,实现分类问题,好像是学习了一些基础知识后的一个小项目阶段,通过这个分类问题,可以知道整个pytorch的工作流程是什么,会了一个分类,那就可以解决其他的分类问题&#xff0…

JWT令牌、过滤器Filter、拦截器Interceptor

目录 JWT令牌 简介 JWT生成 解析JWT 登陆后下发令牌 过滤器(Filter) Filter快速入门 Filter拦截路径 过滤器链 登录校验Filter-流程 拦截器(Interceptor) Interceptor 快速入门 拦截路径 登录校验流程 JWT令牌 简介 全称:JSON Web Token(https://iwt.io/) …

可信计算和数字水印技术

可信计算 可信计算可信计算基础概述可信计算关键技术要素可信性认证可信计算优劣 数字水印技术数字版权保护技术 可信计算 可信计算基础概述 可信计算(Trusted Computing,TC):在计算和网络通信系统中广泛使用的、基于硬件安全模块…

驱动开发(五):Linux内核定时器

驱动开发系列文章: 驱动开发(一):驱动代码的基本框架 驱动开发(二):创建字符设备驱动 驱动开发(三):内核层控制硬件层 驱动开发(四&#xff…

LabVIEW盾构机状态监测

随着城市化的加速,地铁成为了城市交通的重要组成部分。为了保障地铁施工安全和效率,提出了一种基于LabVIEW的地铁施工盾构异常状态监测方法。该方法利用LabVIEW软件进行数据采集和处理,通过异常监测技术实时监控盾构机的运行状态,…

【纯干货级教程】深度学习根据loss曲线进行分析调参

相信很多刚刚接触目标检测系列算法小伙伴跑深度学习算法时会有许多困惑,比如训练得出的loss曲线有什么意义?训练的一些参数要如何设置选择?选择哪个算法模型作为baseline、选择哪个参数量/复杂度/深度的模型进行训练最为合适? 本…

Apache IoTDB进行IoT相关开发实践

当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计&…

15. 第十五章 类和对象

15. 类和对象 到现在你已经知道如何使用函数组织代码, 以及如何使用内置类型来组织数据. 下一步将学习面向对象编程, 面向对象编程使用自定义的类型同时组织代码和数据. 面向对象编程是一个很大的话题, 需要好几章来讨论.本章的代码示例可以从↓下载, https://github.com/Alle…

Linux 并发与竞争实验学习

Linux 并发与竞争实验学习 原子操作实验 这里原子操作就是采用原子变量来保护一个程序运行的完整过程,使用atomic 来实现一次只能允许一个应用访问 LED,创建atomic.c文件,其实改动内容就是添加原子变量, 要在设备结构体数据添加…

MEMS:Lecture 19 Wafer bonding package

讲义 Current MEMS Packages Die Level (芯片级) 封装 图片描述:左侧的图显示了Cronos继电器的芯片级封装。这种封装方式是在晶圆切割后,将独立的MEMS芯片组装到单独的陶瓷封装中。特点: Die level release and ceramic package&#xff1a…

数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)

数据库管理204期 2024-06-15 数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)1 SSD物理结构2 SSD颗粒类型3 DRAM & SLC Cache3.1 DRAM3.2 SLC Cache3.3 其他方式 4 缓外降速总结 数据库管理-第204期 数据库的IO掉速&#xff…