Python 芹菜工人变量共享问题
我正在一个项目中使用Python和。在项目中,我有两个文件: celeryconfig.pyPython 芹菜工人变量共享问题,python,multiprocessing,celery,celery-task,celeryd,Python,Multiprocessing,Celery,Celery Task,Celeryd,我正在一个项目中使用Python和。在项目中,我有两个文件: celeryconfig.py BROKER_URL = "amqp://guest:guest@localhost:5672//" CELERY_RESULT_BACKEND = "amqp" CELERY_IMPORTS = ("example",) CELERYD_CONCURRENCY = 2 from celery.task import task import hashlib md5 = hashlib.md5()
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("example",)
CELERYD_CONCURRENCY = 2
from celery.task import task
import hashlib
md5 = hashlib.md5()
@task
def getDigest(text):
print 'Using md5 - ',md5
md5.update(text)
return md5.digest()
和example.py
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("example",)
CELERYD_CONCURRENCY = 2
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_并发性设置为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>
[PoolWorker-2]使用md5-
[现场工人-2]
[PoolWorker-1]使用md5-
[现场工人-1]
为了简单起见,我使用hashlib的md5对象,但在我的实际项目中,我使用的对象不能被多个进程访问和修改。这无疑会让工人们崩溃
这就引出了一个问题:如何修改代码,使工作进程初始化并使用它们自己的(md5)对象?现在,它们共享同一个对象-导致我的应用程序崩溃。这是可能的吗?他们使用的是同一个对象,因为您在代码中明确告诉他们要这样做。通过在任务范围外创建对象并在任务内使用它,您将为所有工作人员提供对共享对象的访问权限。这是一个并发问题,不一定是芹菜问题。如果对象很小,可以使用它的副本,或者使用自己的锁定策略。但是,一般来说,如果一个对象一次要被多个进程更新,它需要采用某种同步,这超出了芹菜的范围。它不是同一个对象。芹菜复制过程公关工作者,这给你相同的md5对象标识在这种情况下。非常明确的问题!我希望有更多的人把这写清楚。