我有一个芹菜定期任务,但是该任务仅在运行芹菜工作者或运行芹菜节拍时运行。我已将任务配置为在Django settings.py
文件中每20分钟运行一次,但是经过20分钟的检查后,芹菜工人没有收到任何任务。
芹菜节拍台
celery beat v4.4.4 (cliffs) is starting.
__ - ... __ - _
LocalTime -> 2020-07-16 12:10:18
Configuration ->
. broker -> amqp://guest:**@localhost:5672//
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> celerybeat-schedule
. logfile -> [stderr]@%INFO
. maxinterval -> 5.00 minutes (300s)
[2020-07-16 12:10:18,835: INFO/MainProcess] beat: Starting...
当我退出此节拍并再次重新启动时,芹菜工作者立即收到任务并执行。
我希望芹菜工作者每20分钟定期接收并执行一次任务。我该怎么做?
我在两个不同的控制台中运行芹菜工作者和芹菜节拍。
我用过命令
celery -A myproj worker -l info
for worker
celery -A myproj beat -l info --pidfile=
拍子
tasks.py
app = Celery('myproj')
@app.task
def schedule_task():
running_tasks = Task.objects.filter(Q(status=0) | Q(status=1))
print(running_tasks)
for task in running_tasks:
unique_id = task.unique_id
keywords = task.keywords.all()
if task.scraping_end_date > timezone.now().date():
settings = {
'spider_count': len(task.targets.all()),
'keywords': keywords,
'scraping_end': task.scraping_end_date,
'unique_id': unique_id, # unique ID for each record for DB
'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
}
for site_url in task.targets.all():
domain = urlparse(site_url.domain).netloc
spider_name = domain.replace('.com', '')
task = scrapyd.schedule('default', spider_name, settings=settings,
url=site_url.domain, domain=domain, keywords=keywords)
else:
task.status = 2
task.save()
settings.py
CELERY_BROKER_URL = 'amqp://localhost'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERYBEAT_SCHEDULE = {
'crawl_sites': {
'task': 'crawler.tasks.schedule_task',
'schedule': crontab(minute='*/20'),
},
}
答案 0 :(得分:3)
替换行
'schedule': crontab(minute=20),
到
'schedule': crontab(minute='*/20'),
还重新启动芹菜节拍。