在虚拟机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创建的虚拟环境 可能有冲突。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有