Celeryのスレッドを使用して非常に簡単な定期コードがあります。 "Pre"と "Post"を印刷し、その間に寝るだけです。それは、このコードは'already in use...'
決してプリントthis StackOverflow questionとthis linked websiteCelery periodic_taskが複数回並列に実行されています
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...'
から構成されています。デコレータ@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'
]
}
}
+1私の問題に関連しているようです。私はキャッシュを使用しようとしましたが、依然として 'counter 'の値が不正です。また、複数の作業者が 'test'関数に入ることがわかりました。私はdjangoを使ってcelerydを実行しています: 'python manage。py celeryd -v 2 -B -s Celery -E -l INFO' – user
'test'関数が単純に" hello "を出力するように単純化しても、別のワーカーで動作し、あまりにも頻繁に印刷します(たとえ私が'@ single_instance_task'デコレータが定義されています)。 – user
私は(上の)コードを簡略化して、(あなたが示唆したように)印刷するようにしました。 ''すでに使用中です... ''という印字はしません。何とかキャッシュが正常にロックされていません。 – user