您的位置:首页 > 健康 > 养生 > celery-APP在windows平台的发布方法(绿色免安装exe可和eventlet)

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

2024/12/23 7:49:12 来源:https://blog.csdn.net/wjcroom/article/details/142167074  浏览:    关键词:celery-APP在windows平台的发布方法(绿色免安装exe可和eventlet)

初级示例

先做了一个celery app

#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

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

最后

pyinstaller -F  clyapp.py 

在dist目录找clyapp.exe,双击运行然后 python client.py
如果正常输出,将clyapp.exe拷贝到其他机器,继续测试.应该也能输出.

进阶版

由于threads性能堪忧,而且celery.control.revoke(taskid)无法取消任务.提示方法没有实现,下面改用eventlet.终止和更新状态,而且响应很快.是window平台的推荐方式.genvent 为了APP移植到其他机器…先将上面代码

argv= [   'worker' , '-Pthreads' ,'-ldebug' ]

变更为

argv= [   'worker' , '-Peventlet' ,'-ldebug' ]

然后python clyapp.py
然后打开新cmd,python client.py
窗口可以收到请求消息,然后不会执行下面的任何动作.不能到任务里面去.
继续测试,

 celery  -A clyapp.app worker  -l info -P eventlet

新cmd,python client.py
celery窗口可以收到请求消息,然后执行,
client窗口可以得到返回结果5.
这里的celery方法不是python脚本, 无法生成exe.

问题原因和解决办法

根据猜测,celery有自己的运行时空间和权限,可以自由和eventlet交互,而app没有这个能力,无法调用eventlet,使它调用自身.估计会造成抓着自己的头发飞行的错误.

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

 python -m celery  -A clyapp.celery worker  -l info -P eventlet

这是可行的,eventlet正常执行动作
而python -m 的含义怎么转换为py脚本呢.查看
lib\site-package\celery_main_.py.
里面有main()的使用.
在clyapp.py同目录,自定义一个clymain.py

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版本.

python  clymain.py

新cmd,python client,py
可以执行.这是关键的一步.
*

  • 但是如果取消import clyapp的注释,还是会失败

python clymain.py 这应该是进入自己拽头发的境况.具体原因我也不知.但已经接近完成.

生成最终版本的程序

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

要想使用eventlet.就必须主程序不出现clyapp.
下面是解决办法:
编译的目录下新建hook,文件夹,命名hook-celery.py的文件

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,

from PyInstaller.utils.hooks import collect_all
datas,binaries,hiddenimports=collect_all('requests')

这样就能解决requests的exe环境问题.

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

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

  • 最后运行EXE
    最后将clyapp.py 是调用的如图片文本,py文件放在exe同目录下,可以运行clymain.exe测试, 此文解决eventlet的失去响应的方案,已经提交到geithub celery issue里.

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com