我想用celery任务创建数据库记录。但由于某种原因,object.save()
方法无法使用task.apply_async()
(应用任务异步)。
相同记录(Ticker)在本地运行芹菜任务时保存在数据库中:
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 :(得分:0)
Django服务器( root )和celery( celery_user )任务由不同的用户运行,因此, celery_user 没有写入权限数据库。那么task.apply()
由 root 运行,save()
可以记录task.apply_async()
- celery_user ,但不能。
此问题的短期解决方案是让 celery_user 成为数据库的所有者(使用sqlite3开发环境):
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就会断开连接。确保您正在使用专用于调试的任务。