У меня есть очень простой периодический код, использующий потоки Celery; он просто печатает «Pre» и «Post» и спит между ними. Он адаптирован из этого вопроса StackOverflow и этот связанный веб-сайт
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'
]
}
}