gpt4 book ai didi

python - Celery worker 变量共享问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:32:16 24 4
gpt4 key购买 nike

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

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,这意味着它会将我的任务队列中的任务分配给 < em>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对象,但在我的实际项目中,我使用的是一个不能被多个进程访问和修改的对象。预计这会使 worker 崩溃。

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

最佳答案

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

关于python - Celery worker 变量共享问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com