celery(macos) - redis(centos) -

2019-07-25  本文已影响0人  花括弧

在虚拟机centos上装
了个redis。
配置redis.conf, 1)注释掉了bind 127.0.0.0, 可以任何ip访问
2)注释掉了requirepass,远程连接可以不用输密码
使用redis的目的是:把redis当个 中间的队列,用来存放任务,
然后在centos上运行celery,从redis中取任务


celery实例方法task 封装 任务函数

在主机上的pycharm,用celery封装了个 函数send_register_active_emai. 项目中会用send_register_active_email.delay(email, username, token)调用 该函数。
运行该项目,会一直卡在这个函数。
究竟是 被封装函数delay调用的问题,还是redis配置有问题?
怀疑是 delay函数的问题,因为会卡在send_register_active_email.delay(email, username, token)该函数调用上。
进而,猜测 是 redis的配置问题,因为在centos上 运行任务(celery -A celery_tasks.tasks worker -l info)也没有接收到任务。(第二天 重新运行,结果不卡在那儿了,问题自动消失了,神奇的代码 神奇的环境。。。)


把pycharm的一个Django项目(此项目 使用pycharm建的虚拟环境 -- 即是 项目目录下的venv),拷贝到新的虚拟环境下(作为,任务处理者worker):
dailyfresh -> celery_tasks -> tasks.py文件,要添加以下几行(以便实现,django项目环境的初始化设置)

import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
django.setup()

把pycharm的一个Django项目(此项目 使用pycharm新建的虚拟环境 — 即是 项目目录下的venv),拷贝到新的虚拟环境下。

在新的虚拟环境(使用pyenv建的)下,使用celery -A celery_tasks.tasks worker -l info启动项目下的一个文件 作为任务处理者。
原项目会使用celery发送任务到redis, 而在新移动的项目(新的虚拟环境)下,指定celery_tasks.tasks作为worker 从redis中拿任务 来执行。
此时,会报错:ModuleNotFoundError: No module named 'order',(order其实是项目下的一个app),怎么让项目识别到order 并把order看做一个app?

1)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
把项目下的urls转发 注释掉,就不会报错,也收到了邮件。但是,对该操作 是否会 引起其它的异常,尚不确定。

正确的方式是:

在其中,添加apps.
re_path(r'^order/', include('order.urls', namespace='order')), # 订单模块
改后 如下:
re_path(r'^order/', include('apps.order.urls', namespace='order')), # 订单模块

此时在pycharm的终端下,输入命令celery -A celery_tasks.tasks worker -l info,便可。

关键是要使用pycharm打开 新虚拟环境下的 项目。因为使用pycharm建的项目 是自带虚拟环境的(就是项目下的venv目录) 与 使用pyenv创建的虚拟环境 可能有冲突。

上一篇下一篇

猜你喜欢

热点阅读