Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜工人变量共享问题_Python_Multiprocessing_Celery_Celery Task_Celeryd - Fatal编程技术网

Python 芹菜工人变量共享问题

Python 芹菜工人变量共享问题,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()

我正在一个项目中使用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()

@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对象标识在这种情况下。非常明确的问题!我希望有更多的人把这写清楚。