芹菜工人变量共享问题

2024-10-01 17:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

芹菜配置.py

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

而且示例.py

^{pr2}$

芹菜配置.py,我将CELERYD\u并发性设置为2,这意味着它将把任务队列中的任务分配给2不同的进程。在

在Python控制台中,我运行:

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

这将创建两个任务,这两个任务由两个工人同时执行。 问题是,由于两个工作进程都在运行其任务函数[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)对象?现在,他们共享同一个对象-导致我的应用程序崩溃。这可能吗?在


Tags: 项目对象pyamqp进程examplemd5celery
1条回答
网友
1楼 · 发布于 2024-10-01 17:25:46

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

相关问题 更多 >

    热门问题