2017-02-14 82 views
1

我想使用celery任务创建数据库记录。但由于某种原因,object.save()方法不适用于task.apply_async()(应用任务asynchronousy)。而本地运行它Djando Celery:Celery任务不会在数据库中创建记录

相同的记录(北京时间)保存在用芹菜任务数据库:

get_all_tickers.apply() 

但不保存与异步模式:

get_all_tickers.apply_async() 

在这两种情况下,INSERT语句在服务器日志中可见。

models.py

class Ticker(TimeStampedModel): 
    ask = models.DecimalField(max_digits=18, decimal_places=8) 
    bid = models.DecimalField(max_digits=18, decimal_places=8) 
    pair = models.ForeignKey(Pair) 

tasks.py

from celery import shared_task 
... 
@shared_task() 
def get_all_tickers(): 
    pair = Pair.objects.last() 
    ticker = Ticker(ask=Decimal(1.0), bid=Decimal(1.0), pair=pair) 
    ticker.save() 

回答

0

Django的服务器()和芹菜(celery_user)任务是由不同的用户运行,因此,celery_user尚未获得对t的写入权限他数据库。那么task.apply()运行根并且可以save()记录和task.apply_async() - 通过celery_user并且不能。

此问题的短期解决方案是使celery_user数据库的所有者(使用sqlite3的发展ENV):

chown celery_user:celery_user db.sqlite3 

虽然,添加组到celery_user会更适当(短期)。

或长期的 - 一切运行与非特权用户https://www.syncano.io/blog/configuring-running-django-celery-docker-containers-pt-1/

P.S:我有一些问题http://docs.celeryproject.org/en/latest/reference/celery.contrib.rdb.html(芹菜调试工具)。每次接收任务时(即每隔30秒)Telnet都会断开连接。确保您正在使用专用于调试的任务。

相关问题