Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:celery [2014/08/17 15:57] alfred [Tasks] |
fw:celery [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 412: | Línea 412: | ||
| add.name | add.name | ||
| </code> | </code> | ||
| - | + | The bind parameter for ''@task'' allows to the task to recibe information of its calling using the [[http://docs.celeryproject.org/en/latest/userguide/tasks.html#context|request variable]]. The data is accessed in the ''self'' variable. \\ | |
| + | You can also use the ''.retry()'' method to send the same task again. This method cuts the execution of the task, it's because it throws an exception. If you don't want this behaviour set the ''throw'' parameter for ''retry()'' as ''False''. There also is the ''max_retries'' properties. Or the ''default_retry_delay'' for the task (default set as 30 secs). | ||
| + | <code python> | ||
| + | @app.task(bind=True) | ||
| + | def send_twitter_status(self, oauth, tweet): | ||
| + | try: | ||
| + | twitter = Twitter(oauth) | ||
| + | twitter.update_status(tweet) | ||
| + | except (Twitter.FailWhaleError, Twitter.LoginError) as exc: | ||
| + | raise self.retry(exc=exc) | ||
| + | </code> | ||
| + | * More [[options for tasks]]. | ||
| + | * If you don’t care about the results of a task, be sure to set the ignore_result option, as storing results wastes time and resources. | ||
| + | * Disabling rate limits altogether is recommended if you don’t have any tasks using them. This is because the rate limit subsystem introduces quite a lot of complexity (with ''CELERY_DISABLE_RATE_LIMITS'' variable set as ''True''). | ||
| ==== Routing ==== | ==== Routing ==== | ||
| Option ''CELERY_CREATE_MISSING_QUEUES'' setted as ''True'' will allow Celery to autoconfigure queues by default. Default queue is named ''celery''. To change it you will use: | Option ''CELERY_CREATE_MISSING_QUEUES'' setted as ''True'' will allow Celery to autoconfigure queues by default. Default queue is named ''celery''. To change it you will use: | ||
| Línea 528: | Línea 540: | ||
| ==== Testing ==== | ==== Testing ==== | ||
| With the configuration ''CELERY_ALWAYS_EAGER'' assigned as True, all the workers are called without any asynchronous behavior. | With the configuration ''CELERY_ALWAYS_EAGER'' assigned as True, all the workers are called without any asynchronous behavior. | ||
| + | ==== Periodic tasks ==== | ||
| + | You can call Celery tasks in concrete moments: [[http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html| periodic tasks guide]]. To do so you need a beat process (only one) to call the workers when it's needed. Next example are two files: | ||
| + | * **beat.py**, which is executed as: ''celery -A beat beat'' | ||
| + | <code python> | ||
| + | from datetime import timedelta | ||
| + | from celery import Celery | ||
| + | from tasks import app | ||
| + | |||
| + | app.conf.update( | ||
| + | CELERYBEAT_SCHEDULE = { | ||
| + | 'add-every-30-seconds': { | ||
| + | 'task': 'tasks.add', | ||
| + | 'schedule': timedelta(seconds=10) | ||
| + | }, | ||
| + | }, | ||
| + | CELERY_TIMEZONE = 'UTC' | ||
| + | ) | ||
| + | </code> | ||
| + | * **tasks.py**, which is executed as: ''celery -A tasks worker'' | ||
| + | <code python> | ||
| + | from celery import Celery | ||
| + | import datetime | ||
| + | |||
| + | app = Celery('tasks', broker='amqp://guest@192.168.0.100//') | ||
| + | |||
| + | @app.task | ||
| + | def add(): | ||
| + | f = open('/home/alfred/a.txt', 'a') | ||
| + | f.write(str(datetime.datetime.now())) | ||
| + | f.close() | ||
| + | </code> | ||
| + | |||
| ==== Little tools ==== | ==== Little tools ==== | ||
| - | === Periodic tasks === | + | |
| - | You can call Celery tasks in concrete moments: [[http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html| periodic tasks guide]]. | + | |
| === HTTP Callbacks === | === HTTP Callbacks === | ||
| Línea 633: | Línea 676: | ||
| $ python manage.py celeryd -l info | $ python manage.py celeryd -l info | ||
| </code> | </code> | ||
| + | |||
| + | ==== Notes ==== | ||
| + | * If you want to use print you must set ''CELERY_REDIRECT_STDOUTS'' to ''False''. | ||
| + | |||
| + | === Execute celery task from c# === | ||
| + | <code csharp> | ||
| + | using (var channel = connection.CreateModel()) | ||
| + | { | ||
| + | var guid = Guid.NewGuid().ToString(); | ||
| + | string message = String.Format("{{\"id\": \"{0}\", \"task\": \"my.task\", \"args\": [1, 2]}}", guid); | ||
| + | var body = Encoding.UTF8.GetBytes(message); | ||
| + | |||
| + | IBasicProperties props = channel.CreateBasicProperties(); | ||
| + | props.ContentType = "application/json"; | ||
| + | props.ContentEncoding = "UTF-8"; | ||
| + | //channel.QueueDeclare("celery", true, true, false, null); | ||
| + | channel.BasicPublish("celery", "celery", props, body); | ||
| + | |||
| + | Console.WriteLine(" [x] Sent {0}", message); | ||
| + | } | ||
| + | </code> | ||
| + | When task is: | ||
| + | <code python> | ||
| + | app = Celery('tasks', broker='amqp://guest@192.168.0.100//') | ||
| + | @app.task(name='my.task', ignore_result=True) | ||
| + | def add(a, b): | ||
| + | logger = get_task_logger(__name__) | ||
| + | logger.critical('tralara lalala ' + str(a+b)) | ||
| + | </code> | ||
| + | |||