在flask中使用celery执行异步任务发送短信,redis作为broker

版权声明:随手笔记,请勿模仿 https://blog.csdn.net/qq_20681909/article/details/86609294

说起这个celery简直就是个大坑,Django中用的时候害我搞了一个星期,虽然是边玩边搞的,但是不妨碍我这么评价他,flask的时候又让我搞了差不多一天

我写的python项目都是在windows7上写的,使用的包也都是最新的,没有什么降版本直说,那些说celery4.0以后都不支持在windows上用的人我不知道依据是什么

我的celery是4.2.1版本的,python是3.7最新版本的,redis是2.10.6版本的,之前写Django项目的时候降的,因为3.1版本的和celery4.0以后的不兼容,有用Django遇到错误的可以看 我的另一篇文章https://blog.csdn.net/qq_20681909/article/details/84848137

这里就说说我在flask中遇到的坑吧,本来很简单的用法就是,但是在我的项目中就是那么多事

新建一个tasks.py文件

from celery import Celery
from ihome.libs.yuntongxun.sms import CCP

#定义celery对象
# celery_app=Celery("ihome",broker="redis;//127.0.0.1:6379/1")      #最初的写法   

celery_app=Celery("ihome")      #    后来改的
celery_app.conf.broker_url = 'redis://127.0.0.1:6379/1'

@celery_app.task
def send_sms(mobile,datas,temp_id):
    print("进入任务")
    ccp=CCP()
    #由于有效期是分钟,所以需要把秒转换为分钟
    result=ccp.sendTemplateSMS(mobile,datas,temp_id)
    if result==0:
        print("发送成功")
    else :
        print("发送失败")

最初的代码是直接创建一个celery对象,然后直接在命令行中敲命令

celery -A ihome.tasks.task_sms  worker -l info

但是报了一个这样的错误

consumer: Cannot connect to amqp://guest:**@redis%3B%2F%2F%40127.0.0.1%3A6379%2F1:5672//: failed to resolve broker hostname.
Trying again in 32.00 seconds...

然后就是各种百度,先是降celery版本,奈何我的破电脑执行pip uninstall celery 命令的时候卸载不干净,也报了一个错,然后不管他,又开始装pip install celery==3.1.*    具体版本忘记了,也装不上, 还是报错,没办法就继续逼着我调4.2.1版本了,不调别的用不了,然后又是各种百度了,所以就找了一这样的命令,原型是

app.conf.broker_url = 'redis://127.0.0.1:6379/1'

我不知道这个app是flask中的app还是celery中的app , 反正随便用,大不了再删, 然后就改成了我下面创建的celery_app对象

celery_app.conf.broker_url = 'redis://127.0.0.1:6379/1'

添加这样的命令还是报错,最后把     celery_app=Celery("ihome")里面的broker删除了,但是又报了一个

  File "d:\python37\lib\site-packages\celery\app\trace.py", line 537, in _fast_trace_task
    tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
继续百度,说是windows10报这样的错,可我的是windows7啊,解决办法是装一个

pip install --upgrade https://github.com/celery/celery/tarball/master

执行work命令celery -A ihome.tasks.task_sms  worker -l info -P eventlet

这么个东东,继续报错,继续搜,又装了一个

pip install  "celery[redis]"

然后执行celery -A ihome.tasks.task_sms  worker -l info -P eventlet,任务开起来了,但是和原本的celery有不一样的地方

F:\iHome>celery -A ihome.tasks.task_sms  worker -l info -P eventlet

 -------------- celery@USER-20181219CW v4.2.1 (windowlicker)
---- **** -----
--- * ***  * -- Windows-7-6.1.7601-SP1 2019-01-23 14:08:50
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         ihome:0x4e51668
- ** ---------- .> transport:   redis://127.0.0.1:6379/1
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 4 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . ihome.tasks.task_sms.send_sms

[2019-01-23 14:08:50,381: INFO/MainProcess] Connected to redis://127.0.0.1:6379/1
[2019-01-23 14:08:50,388: INFO/MainProcess] mingle: searching for neighbors
[2019-01-23 14:08:51,416: INFO/MainProcess] mingle: all alone
[2019-01-23 14:08:51,433: INFO/MainProcess] celery@USER-20181219CW ready.
[2019-01-23 14:08:51,445: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/1.

多了几条看不懂什么玩意的东西

异步任务算是可以执行了,

print("进入任务")

是可以马上执行的,

但是开始测试发送短信的时候,采用的是容联云的sdk,测试版的,短信发送失败,需要等待1分钟才返回测试失败,不知道bug在哪里,也没有报错,返回的请求包体是空的,考虑到异步任务调试好了,然后就懒得搞了

还有就是还装了一个pip install celery-with-redis也是百度搜索的说需要用到

不知道各位朋友都遇到什么样的问题,我的是这样的,希望这篇文章能对你们有些帮助,顺便也方便以后我再遇到这样的情况又要百度半天,所以就记录下来的;

还有发送短信的BUG如果有朋友遇到这样的情况,或者懂的话希望可以帮帮忙请教一下;留言板留下联系方式,我主动找您,谢谢

celery -A ihome.tasks.task_sms  worker --pool=solo -l info

猜你喜欢

转载自blog.csdn.net/qq_20681909/article/details/86609294