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}'
相关推荐
李洋-蛟龙腾飞公司4 分钟前
HarmonyOS NEXT应用元服务常见列表操作分组吸顶场景
linux·运维·windows
码农垦荒笔记23 分钟前
Git 安装闭坑指南(仅 Windows 环境)
windows·git
精灵vector1 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习1 小时前
Python入门Day2
开发语言·python
阿幸软件杂货间1 小时前
Windows 10 2016 长期服务版
windows·系统·win10
Vertira2 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉2 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗2 小时前
黑马python(二十四)
开发语言·python
晓13133 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr
是小王同学啊~3 小时前
(LangChain)RAG系统链路向量检索器之Retrievers(五)
python·算法·langchain