原文转载自「刘悦的技术博客」https://v3u.cn/a_id_115

大家都知道,Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,在之前的一篇文章中:python3.7+Tornado5.1.1+Celery3.1+Rabbitmq3.7.16实现异步队列任务详细阐述了如何进行安装部署和使用,但是过程太繁琐了,先得安装Erlang,再安装rabbitmq,然后各种配置,最后由于async关键字问题还得去修改三方库的源码,其实我们可以通过docker来将celery服务封装成镜像,如此一来,以后再使用celery或者别的系统依赖celery,我们只需要将该镜像以容器的形式跑服务即可,不需要繁琐的配置与安装。

首先新建celery_with_docker文件夹,cdcelery_with_docker

建立dockerfile文件

FROM python
LABEL author="liuyue"
LABEL purpose = '' RUN apt update
RUN pip3 install setuptools ENV PYTHONIOENCODING=utf-8 # Build folder
RUN mkdir -p /deploy/app
WORKDIR /deploy/app
#only copy requirements.txt. othors will be mounted by -v
#COPY app/requirements.txt /deploy/app/requirements.txt
#RUN pip3 install -r /deploy/app/requirements.txt
RUN pip3 install celery # run sh. Start processes in docker-compose.yml
#CMD ["/usr/bin/supervisord"]
CMD ["/bin/bash"]

意思是基础镜像我们使用python,然后安装celery

然后新建docker-compose.yml

# Use postgres/example user/password credentials
version: '3.4' services:
myrabbit:
#restart: always
#build: rabbitmq/
image: rabbitmq:3-management
# hostname: rabbit-taiga
environment:
RABBITMQ_ERLANG_COOKIE: SWQOKODSQALRPCLNMEQG
# RABBITMQ_DEFAULT_USER: "guest"
# RABBITMQ_DEFAULT_PASS: "guest"
# RABBITMQ_DEFAULT_VHOST: "/"
# RABBITMQ_NODENAME: taiga
RABBITMQ_DEFAULT_USER: liuyue
RABBITMQ_DEFAULT_PASS: liuyue
ports:
- "15672:15672"
# - "5672:5672" api:
#restart: always
stdin_open: true
tty: true
build: ./
image: celery-with-docker-compose:latest
volumes:
- ./app:/deploy/app
ports:
- "80:80"
command: ["/bin/bash"] celeryworker:
image: celery-with-docker-compose:latest
volumes:
- ./app:/deploy/app
command: ['celery', '-A', 'tasks', 'worker', '-c', '4', '--loglevel', 'info']
depends_on:
- myrabbit

这个配置文件的作用是,单独拉取rabbitmq镜像,启动rabbitmq服务,用户名和密码为:liuyue:liuyue然后在镜像内新建一个celery工程,目录放在/deploy/app,随后通过挂载文件夹的方式将宿主的app目录映射到/deploy/app,最后启动celery服务

最后,我们只需要在宿主机建立一个app文件夹,新建一些任务脚本即可

新建tasks.py

from celery import Celery

SERVICE_NAME = 'myrabbit'
app = Celery(backend = 'rpc://', broker = 'amqp://liuyue:liuyue@{0}:5672/'.format(SERVICE_NAME)) @app.task
def add(x, y):
print(123123)
return x + y

新建任务调用文件test.py

import time
from tasks import add
# celery -A tasks worker -c 4 --loglevel=info t1 = time.time()
result = add.delay(1, 2)
print(result.get()) print(time.time() - t1)

最后项目的目录结构是这样的

随后在项目根目录执行命令:docker-compose up --force-recreate

此时celery和rabbitmq服务已经启动

进入浏览器http://localhost:15672用账号登录 liuyue:liuyue


没有问题,此时我们进入容器内部

docker exec -i -t celery-with-docker-compose-master_api_1 /bin/bash

可以看到,容器内已经通过挂载将宿主机的app文件夹共享了进来

随后我们执行异步任务:python3 test.py

可以看到执行成功了

由此可知,在宿主机,什么环境都不需要配置,只需要安装一个docker即可,异步任务队列的搭建和执行全部在docker的内部容器内,完全隔绝,只是具体的代码和脚本通过docker的挂载命令来在宿主机编写,也就是研发人员只需要在宿主机专注编写代码,而不需要管配置和部署的问题。

最后,附上项目的完整代码:https://gitee.com/QiHanXiBei/celery-with-docker-composer

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_115

最新文章

  1. Redis的三种启动方式
  2. js中let和var定义变量的区别
  3. jquery修改table某列的值
  4. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题
  5. CSS 文件的4种引入方式
  6. ajax删除数据(不跳转页面)
  7. 身份证号码的正则表达式及验证详解(JavaScript,Regex)
  8. C# 计算地图上某个坐标点的到多边形各边的距离
  9. React 中的this.setState
  10. mysql数据库目录my.ini的内容
  11. FFmpeg中overlay滤镜用法-水印及画中画
  12. BZOJ3199 SDOI2013 逃考 半平面交、最短路
  13. 「SHOI2016」黑暗前的幻想乡 解题报告
  14. 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象
  15. 学习knockoutjs轻量级的MVVM框架
  16. JavaScript中数组中遍历的方法
  17. 项目Beta冲刺(团队)随笔集
  18. 使用 TClientDataSet(1)
  19. [转]Socket编程中,阻塞与非阻塞的区别
  20. [ MongoDB ] 副本集的搭建及测试

热门文章

  1. Java注解Annotaton
  2. (原创)[C#] MEF 主程序与插件加载不同版本的DLL
  3. PostGIS 扩展创建失败原因调查
  4. 今天才发现ThinkPad的触摸板简直好用!傻乎乎的自己
  5. Unity-UGUI-无限循环列表
  6. flowable如何适配国产数据库达梦
  7. 2 Elment Ui 日期选择器 格式化问题
  8. numpy中的np.round()取整的功能和注意
  9. 搭建zabbix及报错处理
  10. 梯度下降算法实现原理(Gradient Descent)