celery

Running Celery worker inside an app context still raises “working outside of app context” error in task

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-07 02:50:53
问题 I am using Miguel Grinberg's article to set up Celery with the app factory pattern in order to send email with Flask-Mail. I've been calling various scripts that use Celery without any issues. However I keep getting Runtime Error: working outside of application context with the following task even though I am running the worker inside an app context. Why am I getting this error? How do I get Flask-Mail to work in Celery? email.py : from flask import current_app, render_template from flask.ext

Shared XMPP connection between Celery workers

风格不统一 提交于 2019-12-07 02:21:28
问题 My web app needs to be able to send XMPP messages (Facebook Chat), and I thought Celery might be a good solution for this. A task would consist of querying the database and sending the XMPP message to a number of users. However, with that approach I would have to connect to the XMPP server every time I run a task, which is not a great idea. From the Facebook Chat API docs: Best Practices Your Facebook Chat integration should only be used for sessions that are expected to be long-lived.

Celery 分布式框架 学习

孤街浪徒 提交于 2019-12-07 01:52:51
一、概要 官网: http://www.celeryproject.org/ 官方文档: http://docs.celeryproject.org/en/latest/index.html 一个AMQP: http://abhishek-tiwari.com/post/amqp-rabbitmq-and-celery-a-visual-guide-for-dummies 其他的文章,一般都太老了。还是直接看官方文档吧。 有问题还是直接去Google或直接去StackOverflow吧,百度真心不靠谱!!! 二、简单DEMO tasks.py # coding:utf-8 from celery import Celery # backend = 'db+mysql://root:@localhost/celery' backend = 'amqp' broker = 'amqp://guest@localhost//' app = Celery('tasks', backend=backend, broker=broker) @app.task def add(x, y): return x + y 添加参数直接以 worker 形式运行即可,便形成了一个 worker。 # celery -A tasks worker -l debug # debug 调试模式

celery beat实战

断了今生、忘了曾经 提交于 2019-12-06 20:48:42
测试CELERYBEAT的例子: celery_test |proj |__init__.py |celery.py |email_task.py |calcu_tasks.py start_server.sh |proj_v1 |xxx_task.py __init__.py为空文件。 celery.py, #-*-coding=utf-8-*- from __future__ import absolute_import from celery import Celery from celery . schedules import crontab from kombu import Queue app = Celery ( "proj" , broker = "redis://10.121.84.90:16379/6" , include = [ 'proj.email_task' , 'proj.calcu_tasks' ] #!!!!! ) app . conf . update ( CELERY_DEFAULT_QUEUE = 'default' , CELERY_QUEUES = ( Queue ( 'hipri' ),), #CELERY_ROUTES={ #"proj.email_task.do_email":{'queue':'hipri'}, #},

面试之Celery

淺唱寂寞╮ 提交于 2019-12-06 20:48:23
Celery 什么是Celery? 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。 单个 Celery 进程每分钟可处理数以百万计的任务。 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。 我们的代码是自上而下同步执行的,当遇到一些耗时的操作时,系统有可能会被阻塞,那么对用户的响应将会被延迟,这样势必会导致用户界面的倒计时延时,这样就会很影响用的体验。 那么我们可以考虑将耗时操作进行异步操作,将耗时操作的任务从我们的主体任务中分离出来,也就是系统解耦 生产者消费者设计模式 生产者消费者设计模式即寻找中间人搭桥,保证两个业务没有直接关联 这种设计模式由三部分组成:生产者=》消息队列《=消费者 生成者负责生成消息,缓存到消息队列中,消费者要读取消息队列中的消息并执行 中间人broker(消息队列) Celery需要一种解决消息的发送和接收的方式,那这种用来存储中间装置的一般称为message broker,即消息中间人 1、RabbitMQ RabbitMQ是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。 RabbitMQ的应用场景 1、异步处理 2、流量削峰 MQ可以将任务收集起来然后转交给不同的工人去做,可以有效的避免流量的峰值 3、日志处理 主要是针对kakfa的,大数据的平台日志非常大 4

解决Celery进程重启后,正在进行中的任务丢失或者标记为失败

此生再无相见时 提交于 2019-12-06 20:45:30
修改配置如下: task_reject_on_worker_lost = True task_acks_late = True 该配置可以保证task不丢失,中断的task在下次启动时将会重新执行。 task_reject_on_worker_lost 作用是当worker进程意外退出时,task会被放回到队列中 task_acks_late 作用是只有当worker完成了这个task时,任务才被标记为ack状态 需要说明的是,backend最好使用rabbitmq等支持ACK状态的消息中间件。 来源: CSDN 作者: shn7798 链接: https://blog.csdn.net/shn7798/article/details/78070187

celery 消息队列与定时任务

女生的网名这么多〃 提交于 2019-12-06 20:41:06
在进行定时获取代理ip, 黑名单ip,以及进行ip校验,相关信息及特征获取时,需要用到定时任务,常见的使用 linux 的crontab 来实现定时任务。但是为了在使用django,保持设计的一致性,就采用 celery 消息队列的定时任务来做。 开发环境: centos 7 python3.5 Name: celery Version: 4.0.2 mongodb, django d都是最新的 有关celery [直接摘自参考的博客,懒得写] Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务( async task )和定时任务( crontab )。它的架构组成如下图: 可以看到, Celery 主要包含以下几个模块: 任务模块 包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。 消息中间件 Broker Broker ,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。 Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。 任务执行单元 Worker Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。

celery异步,延时任务, 周期任务

荒凉一梦 提交于 2019-12-06 20:40:55
  celery中文译为芹菜,是一个分布式任务队列. 是异步的,所以能处理大量消息   最新的celery不支持windows下使用了,所以在使用pycharm安装celery模块之后,需要再安装eventlet模块才能测试运行. 一.异步任务 启动客户端: s1,s2要在项目目录下,如果在文件夹中执行,terminal输入命令的时候要-A 项目文件夹的名字 c=Celery( " task " ,broker= " redis://127.0.0.1:6379/2 " ,backend= " redis://127.0.0.1:6379/1 ", include="项目名.文件夹" ) Terminal中输入 celery worker -A s1 -l info -P eventlet   给定两个文件   s1.py from celery import Celery import time c =Celery( " task " ,broker= " redis://127.0.0.1:6379/2 " ,backend= " redis://127.0.0.1:6379/1 " ) @c.task def myfun1(a,b): return f " myfun1{a}{b} " @c.task def myfun2(): return " myfun2 " @c

Django中celery异步任务队列的实现

余生长醉 提交于 2019-12-06 20:40:39
Celery异步任务队列 本质:通过创建进程调用函数来实现任务的异步执行。 概念: 任务发出者:发出任务(要执行函数)消息 任务执行者:提前创建的进程 中间人(任务队列):存放发出任务消息 使用: 1)安装: pip install celery 2)创建一个 Celery 类的实例对象并进行相应设置 # main.py from celery import Celery # 创建Celery类对象 celery_app = Celery ( 'demo' ) # 加载配置信息 celery_app . config_from_object ( '配置文件包路径' ) # celery worker启动时自动发现任务函数 celery_app . auto_discover_tasks ( [ . . . ] ) # config.py # 设置中间人地址 # broker_url = 'redis://<ip>:<port>/<db>' broker_url = 'redis://172.16.179.139:6379/3' 3)封装任务函数 @celery_app . task ( name = 'send_sms_code' ) def send_sms_code ( a , b ) : # 任务函数的代码... 4)启动 worker (创建工作进程) xxxxxxxxxx

定时任务管理之python篇celery使用

拥有回忆 提交于 2019-12-06 20:40:25
一、为什么要用celery celery是一个简单、灵活、可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必须工具。他是一个专注于实时处理的任务队列,同时也支持任务调度。 celery是异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。celery用于生产系统每天处理数以百万计的任务。 【注:何为任务队列?任务队列是一种在线程或机器间分发任务的机制。消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务。)】。 Celery 用消息通信,通常使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职程。Celery 系统可包含多个职程和中间人,以此获得高可用性和横向扩展能力。 Celery 需要一个发送和接受消息的传输者。RabbitMQ 和 Redis 中间人的消息传输支持所有特性,但也提供大量其他实验性方案的支持,包括用 SQLite 进行本地开发。 Celery 可以单机运行,也可以在多台机器上运行,甚至可以跨越数据中心运行。 二、celery适用于那些场景 应用场景一:我们知道大型网站的性能非常重要,然而有时不得不做一些相当耗时的操作。 比如SNS网站的“新鲜事儿”系统,我发帖之后,会给所有关注我的人推送一条通知