Celery工人变量共享问题

2024-06-20

我正在使用Python并且celery http://www.celeryproject.org在一个项目中。在项目中,我有两个文件:

celeryconfig.py

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

and 示例.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()

In celeryconfig.py,我设置了CELERYD_CONCURRENCY to 2,这意味着它将把我的任务队列中的任务分发给2不同的过程。

我从 Python 控制台运行:

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

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

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

为了简单起见,我使用的是 hashlib 的 md5 对象,但在我的实际项目中,我使用的是一个对象cannot可以被多个进程访问和修改。这预计会让工人崩溃。

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


他们使用相同的对象,因为您在代码中明确告诉他们。通过在任务范围之外创建对象并在任务内使用它,您可以向所有工作人员授予对共享对象的访问权限。这是一个并发问题,不一定是 Celery 问题。如果对象很小,您可以使用该对象的副本,或者使用您自己的锁定策略。不过,一般来说,如果一个对象一次要由多个进程更新,则需要采用某种同步,这超出了 Celery 的范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Celery工人变量共享问题 的相关文章

随机推荐