芹菜工作器变量共享问题



我在一个项目中使用Python和芹菜。在项目中,我有两个文件:

celeryconfig.py

BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("example",)
CELERYD_CONCURRENCY = 2

example.py

from celery.task import task
import hashlib
md5 = hashlib.md5()
@task
def getDigest(text):
    print 'Using md5 - ',md5
    md5.update(text)
    return md5.digest()

celeryconfig.py中,我将CELERYD_CONCURRENCY设置为2,这意味着它将任务队列中的任务分配给2不同的进程。

从Python控制台,我运行:

from example import getDigest
getDigest.delay('foo');getDigest.delay('bar')

这将创建两个由两个worker同时执行的任务。问题是,当两个工作进程运行它们的任务函数[getDigest()]时,它们似乎使用相同的哈希对象(md5)。celeryd的输出证实了这一点,如下所示。

[PoolWorker-2] Using md5 -
[PoolWorker-2] <md5 HASH object @ 0x23e6870>
[PoolWorker-1] Using md5 -
[PoolWorker-1] <md5 HASH object @ 0x23e6870>

为了简单起见,我使用的是hashlib的md5对象,但在我的实际项目中,我使用的是一个不能被多个进程访问和修改的对象。这不出所料地使工人崩溃。

这带来了一个问题:我如何修改我的代码使工作进程初始化并使用他们自己的(md5)对象?现在,它们共享同一个对象——导致我的应用程序崩溃。这可能吗?

它们使用相同的对象,因为您在代码中显式地告诉它们。通过在任务范围之外创建对象并在任务中使用它,您可以让所有工作人员访问共享对象。这是一个并发问题,不一定是芹菜问题。如果对象很小,您可以使用对象的副本,或者使用您自己的锁定策略。但是,一般来说,如果一个对象要同时被多个进程更新,则需要采用某种同步方式,这超出了Celery的范围。

相关内容

  • 没有找到相关文章

最新更新