celery-APP在windows平台的发布方法(绿色免安装exe可搭配eventlet)

初级示例

先做了一个celery app

bash 复制代码
#filename clyapp.py
from celery import Celery
import sys,types
# Celery configuration
config={}
config['CELERY_BROKER_URL'] = 'redis://IP:6379/0'
config['result_backend'] = 'redis://IP:6379/0'
 
app = Celery('clyapp', broker=config['CELERY_BROKER_URL'] ,fixups=[])
app.conf.update( config)
app.control.purge()
@app.task(bind=True)
def add(self,a,b):
  return a+b
if __name__=='__main__':
    argv= [   'worker' , '-Pthreads' ,'-ldebug' ]
    app.start(argv)

#inshell
#python clyapp.py

然后client.py

bash 复制代码
 
import clyapp

r=clyapp.add.delay(2,3)
print(r.get())
#out put 5,input()

最后

bash 复制代码
pyinstaller -F  clyapp.py 

在dist目录找clyapp.exe,双击运行然后 python client.py

如果正常输出,将clyapp.exe拷贝到redis可抵达的其他机器,继续测试.应该也能输出.

进阶版

由于threads性能堪忧,而且celery.control.revoke(taskid)无法取消任务.提示方法没有实现,genvent测试也有异常, 经测试改用eventlet.可终止,响应很快.搭配更新状态,是window平台的推荐方式.

上代码

bash 复制代码
argv= [   'worker' , '-Pthreads' ,'-ldebug' ]

变更为

bash 复制代码
argv= [   'worker' , '-Peventlet' ,'-ldebug' ]

然后python clyapp.py

然后打开新cmd,python client.py

窗口可以收到请求消息,然后不会执行下面的任何动作.不能到任务里面去.

继续测试,

bash 复制代码
 celery  -A clyapp.app worker  -l info -P eventlet

新cmd,python client.py

celery窗口可以收到请求消息,然后执行,

client窗口可以得到返回结果5.

这里的celery方法不是python脚本, 是exe.而且依赖python环境,无法拷贝即用.所以需要找到一个转变celery.exe为,py脚本的方法.就能解决eventlet下,远程调用接到消息而不执行动作的毛病.

问题原因和解决办法

根据猜测,celery有自己的运行空间和权限,可以自由和eventlet交互,而app没有这个能力,无法与eventlet相互调用,使得app和eventlet,worker的关系会造成抓着自己的头发飞上天.应该也算交叉引用,死循环了. app->eventlet->app ,在第二步,evnetlet会拿起加载了的第一个app使用.而不是正常情况里的,开辟新载入并运行.这一点要靠celery.exe来完成.

因此从破解分拆celery.exe指令开始,它是python -m celery的合成体.

bash 复制代码
 python -m celery  -A clyapp.celery worker  -l info -P eventlet

这样也可行,eventlet正常执行动作

而python -m 的含义怎么转换为py脚本呢.查看

lib\site-package\celery_main _.py.

里面有main()的使用.可以直接引用完成自己的celery.exe

在clyapp.py同目录,自定义一个clymain.py

bash 复制代码
from  celery import __main__ 
#import clyapp
import sys
if __name__=='__main__':

  #  argv= [' -A clyapp.celery' ,'worker','-Pthreads' ,'-linfo' ]
   sys.argv= ['.','-A','clyapp.app' ,'worker','-P','eventlet' ,'-l','info' ]
  
   __main__.main()

这里如果没有sys.argv的赋值,那么这就是一个celery的绿色exe版本.

进入cmd

bash 复制代码
python  clymain.py

新cmd,
python client,py

可以执行.这是关键的一步.

  • 但是如果存在import clyapp,还是会失败,所以必须注释掉.

clymain.py 包含import clyapp, 然后 main() 这应该是进入拽自己头发的境况.回到当初的python clyapp.py的启动方式.

生成最终版本的程序

  • 解决hook
    目前clymain.py是celery的入口, clymain里的import clyapp必须注释掉.这导致
  • pyinstall过程无法自动添加clyapp的依赖.

要想使用eventlet.就必须主程序不出现clyapp.

下面是解决办法:

编译的目录下新建hook,文件夹,命名hook-celery.py的文件

bash 复制代码
from PyInstaller.utils.hooks import collect_all
datas,binaries,hiddenimports=collect_all('celery')
datas,binaries,hiddenimports=collect_all('eventlet')

我的clyapp要用到requires这样的库,靠拷贝还是会报错. 要在hook目录下新建 hook-requests.py,

bash 复制代码
from PyInstaller.utils.hooks import collect_all
datas,binaries,hiddenimports=collect_all('requests')

这样就能解决requests的exe环境问题.其他三方库也是同样过程.

  • 手工拷贝缺少的某些库
bash 复制代码
pyinstaller -D  clymain.py --additional-hooks-dir  hook

必须-D目录方式,这样才能把clyapp缺少库,手工拷贝到_interal目录下 .或者的clymain中,import一下,也有可能有效,否则就只拷贝或hook文件.

  • 最后运行EXE
    最后将clyapp.py 调用的如图片文本,py文件,统统放在exe同目录下,运行clymain.exe测试,

此文解决eventlet的失去响应的方案,已经提交到geithub celery issue里.

本文正式结束,我要去包个饺子,庆祝一下.

借鉴:https://stackoverflow.com/questions/23389104/how-to-start-a-celery-worker-from-a-script-module-main

共享一个远程升级方法.

bash 复制代码
@app.task(bind=True)
def update(self,url2down):
    zipupdate=work4user.requests.get(url2down).content
    ff=io.BytesIO(requests.get(url2down).content)
    ret=''
    with zipfile.ZipFile(ff) as zz:
        ret=','.join([i.filename for i in zz.filelist])
        zz.extractall()
    return f'请手工启动一次服务。本次更新以下文件:{ret}'
相关推荐
lingchen19065 分钟前
Windows CMD 的 `cd`(change directory,切换目录)命令
windows·命令模式
databook35 分钟前
面向数据工程师的正则表达式:从日志清洗到字段提取
python·正则表达式·数据分析
ss2731 小时前
AI全栈实战 | 3.2-01 Python 基础:四大数据容器怎么选,推导式为什么是 Pythonic 的灵魂
开发语言·人工智能·python
计算机毕业编程指导师1 小时前
【大数据毕设选题推荐】基于Spark的WTA职业网球赛事演变与竞技格局分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·计算机·spark·毕业设计·课程设计·wta网球
ITHAOGE151 小时前
下载 | Win11 26H2 正式版发布!(ISO映像、2026年度版本、26300.9457、Windows 11)
windows·科技·微软·电脑
言乐62 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
打工仔折腾 AI2 小时前
LLaMA 1 到 LLaMA 3 架构演进拆解:从 RoPE、GQA 到词表扩张
人工智能·后端·python·深度学习·langchain·llama
旋生万物2 小时前
螺旋角分布的功率谱分析:多窗谱 + FDR 校正
开发语言·python
YCOSA20252 小时前
雨晨 Windows 11 IoT 企业版 Edge 轻装 VCDX 29680.1000
windows·物联网
专业程序开发源3 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计