gpt4 book ai didi

python - Celery periodic_task 并行运行多次

转载 作者:行者123 更新时间:2023-11-28 16:50:58 26 4
gpt4 key购买 nike

我有一些使用 Celery 线程的非常简单的周期性代码;它只是打印“Pre”和“Post”并在两者之间休眠。它改编自 this StackOverflow questionthis linked website

from celery.task import task
from celery.task import periodic_task
from django.core.cache import cache
from time import sleep
import main
import cutout_score
from threading import Lock

import socket
from datetime import timedelta
from celery.decorators import task, periodic_task

def single_instance_task(timeout):
def task_exc(func):
def wrapper(*args, **kwargs):
lock_id = "celery-single-instance-" + func.__name__
acquire_lock = lambda: cache.add(lock_id, "true", timeout)
release_lock = lambda: cache.delete(lock_id)
if acquire_lock():
try:
func()
finally:
release_lock()
return wrapper
return task_exc

LOCK_EXPIRE = 60 * 5 # Lock expires in 5 minutes
@periodic_task(run_every = timedelta(seconds=2))
def test():
lock_id = "lock"

# cache.add fails if if the key already exists
acquire_lock = lambda: cache.add(lock_id, "true", LOCK_EXPIRE)
# memcache delete is very slow, but we have to use it to take
# advantage of using add() for atomic locking
release_lock = lambda: cache.delete(lock_id)

if acquire_lock():
try:
print 'pre'
sleep(20)
print 'post'
finally:
release_lock()
return
print 'already in use...'

此代码从不打印'already in use...';当我使用 @single_instance_task 装饰器时,也会出现同样的现象。

你知道这是怎么回事吗?

编辑:我简化了这个问题,这样它就不会写入内存(使用全局或 django 缓存);我仍然没有看到 'already in use...'


编辑:当我将以下代码添加到我的 Django settings.py 文件时(通过更改 https://docs.djangoproject.com/en/dev/topics/cache/ 中的代码,一切都按预期工作,但仅当我使用端口 11211 时 (奇怪的是,我的服务器在端口 8000 上)

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'127.0.0.1:11211'
]
}
}

最佳答案

你是如何运行celeryd的?我不熟悉线程选项。

如果它正在运行多进程,那么就没有在工作人员之间共享内存的“全局”变量。

如果您希望所有工作人员共享一个计数器,那么我建议您使用 cache.incr

例如:

In [1]: from django.core.cache import cache

In [2]: cache.set('counter',0)

In [3]: cache.incr('counter')
Out[3]: 1

In [4]: cache.incr('counter')
Out[4]: 2

更新

如果你通过 sleep 强制你的任务重叠会发生什么,例如:

print "Task on %r started" % (self,)
sleep(20)
print "Task on %r stopped" % (self,)

如果您在 20 秒后更频繁地运行它而没有得到“已经在使用中...”,那么您就知道缓存没有按预期运行。


另一个更新

您是否在 Django 设置中设置了缓存后端?例如。内存缓存

如果不是,您可能正在使用 Dummy Cache它实际上并没有做任何缓存,只是实现了接口(interface)...这听起来像是您问题的一个令人信服的原因。

关于python - Celery periodic_task 并行运行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7719203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com