我需要以随机的时间间隔运行任务" createNotifications"。这是我在芹菜的设置中要做的。
t = random.randint(45, 85)
## print "time = ", t
## celery app configuration
app.conf.CELERYBEAT_SCHEDULE = {
# Executes at every 't' interval, where t is random
'create-notifications': {
'task': 'apps.notifications.tasks.CreateNotifications',
'schedule': timedelta(seconds=t),
},
}
现在的问题是,这些用于芹菜的设置仅执行一次(当我运行命令python manage.py runserver时),因此变量't',因此timedelta中的"秒"值是随机的,有一个随机的值,但是只有一次。
最终使上述过程成为一个周期性的,固定时间为x秒,仅在启动服务器时随机选择x。
另外,我尝试运行一个任务,并在循环中随机延迟时使用了无尽的任务,因此芹菜AutoDect仅执行一个任务,而该任务永无止境。我的目的是通过随机延迟在段循环中解决的。像这样(注意 ->'while'在函数createNotification())
@app.task
def CreateNotifications():
while True:
upper_limit = models.MyUser.objects.all().aggregate(Max('id'))
lower_limit = models.MyUser.objects.all().aggregate(Min('id'))
## select a user to be notified randomly
to_user = None
to = 0
while to_user is None:
to = random.randint(lower_limit['id__min'], upper_limit['id__max'])
try:
to_user = models.MyUser.objects.get(id=to)
except:
pass
## select a user to be notified from randomly
frm_user = None
frm = to
while frm_user is None:
while frm == to:
frm = random.randint(lower_limit['id__min'], upper_limit['id__max'])
try:
frm_user = models.MyUser.objects.get(id=frm)
except:
pass
notif_type = ['comment on', 'liked', 'shared']
notif_media = ['post', 'picture', 'video']
models.Notification.objects.create(
notified_user = to_user,
notifier = frm_user,
notification_type = random.choice(notif_type),
notification_media = random.choice(notif_media))
to_user.new_notification_count += 1
to_user.save()
t = random.randint(35, 55)
print "delay = ", t
time.sleep(t)
它完全按照我的意愿做事,但是现在有4个不同的工人执行相同的任务,但我只想要一个。
我尝试过更改位于我的Virtualenv/bin/Directory中的芹菜文件,如下所示 ->芹菜。减少过程数量
因为/etc/effaults中没有芹菜文件,但仍然没有成功
任何帮助将不胜感激。
您真的不应该在芹菜任务中放一个无尽的循环。如果您需要一个专门的过程,最好是用它自己而不是通过芹菜运行它。
您将来可以在任务运行时重新安排一项新任务。如下:
@app.task
def create_notifications():
try:
#
finally:
t = random.randint(45, 85)
create_notifications.apply_async(countdown=t)
另一个选项是要执行定期时间表的调度程序任务,但在不久的将来会随机排列通知任务。例如,如果调度程序任务每45秒运行一次。
@app.task
def schedule_notifications():
t = random.randint(0, 40)
create_notifications.apply_async(countdown=t)