Python 使用芹菜任务中的多处理池引发异常

Python 使用芹菜任务中的多处理池引发异常,python,redis,multiprocessing,celery,Python,Redis,Multiprocessing,Celery,对于阅读本文的读者:我决定改用RQ,它在运行使用多处理模块的代码时不会失败。我建议您使用它。 我试图使用Python3和redis作为代理(在Mac上运行),在芹菜任务中使用多处理池。但是,我似乎无法从芹菜任务中创建多处理池对象!相反,我得到了一个奇怪的例外,我真的不知道该怎么办 有人能告诉我如何做到这一点吗 任务: from celery import Celery from multiprocessing.pool import Pool app = Celery('tasks', bac

对于阅读本文的读者:我决定改用RQ,它在运行使用多处理模块的代码时不会失败。我建议您使用它。

我试图使用Python3和redis作为代理(在Mac上运行),在芹菜任务中使用多处理池。但是,我似乎无法从芹菜任务中创建多处理池对象!相反,我得到了一个奇怪的例外,我真的不知道该怎么办

有人能告诉我如何做到这一点吗

任务:

from celery import Celery
from multiprocessing.pool import Pool

app = Celery('tasks', backend='redis', broker='redis://localhost:6379/0')

@app.task
def test_pool():
    with Pool() as pool:
        # perform some task using the pool
        pool.close()
    return 'Done!'
我用以下方法将其添加到芹菜中:

celery -A tasks worker --loglevel=info
然后通过以下python脚本运行它:

import tasks

tasks.test_pool.delay()
返回以下芹菜输出:

[2015-01-12 15:08:57,571: INFO/MainProcess] Connected to redis://localhost:6379/0
[2015-01-12 15:08:57,583: INFO/MainProcess] mingle: searching for neighbors
[2015-01-12 15:08:58,588: INFO/MainProcess] mingle: all alone
[2015-01-12 15:08:58,598: WARNING/MainProcess] celery@Simons-MacBook-Pro.local ready.
[2015-01-12 15:09:02,425: INFO/MainProcess] Received task: tasks.test_pool[38cab553-3a01-4512-8f94-174743b05369]
[2015-01-12 15:09:02,436: ERROR/MainProcess] Task tasks.test_pool[38cab553-3a01-4512-8f94-174743b05369] raised unexpected: AttributeError("'Worker' object has no attribute '_config'",)
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python3.4/site-packages/celery/app/trace.py", line 438, in __protected_call__
    return self.run(*args, **kwargs)
  File "/Users/simongray/Code/etilbudsavis/offer-sniffer/tasks.py", line 17, in test_pool
    with Pool() as pool:
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 150, in __init__
    self._setup_queues()
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 243, in _setup_queues
    self._inqueue = self._ctx.SimpleQueue()
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/context.py", line 111, in SimpleQueue
    return SimpleQueue(ctx=self.get_context())
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/queues.py", line 336, in __init__
    self._rlock = ctx.Lock()
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/context.py", line 66, in Lock
    return Lock(ctx=self.get_context())
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/synchronize.py", line 163, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/synchronize.py", line 59, in __init__
    kind, value, maxvalue, self._make_name(),
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/synchronize.py", line 117, in _make_name
    return '%s-%s' % (process.current_process()._config['semprefix'],
AttributeError: 'Worker' object has no attribute '_config'
这是一种芹菜。它源于台球依赖中引入的一个问题。解决方法是为当前流程手动设置
\u config
属性。感谢user@martinth在下面所做的工作

from celery.signals import worker_process_init
from multiprocessing import current_process

@worker_process_init.connect
def fix_multiprocessing(**kwargs):
    try:
        current_process()._config
    except AttributeError:
        current_process()._config = {'semprefix': '/mp'}

worker\u process\u init
钩子将在worker进程初始化时执行代码。我们只需检查
\u config
是否存在,如果不存在则设置它。

一个快速解决方案是使用
多处理实现。改变

from multiprocessing import Pool  # or whatever you're using


然而,由于这种并行性是基于线程的,所以通常的注意事项(GIL)适用。

我认为您无法从芹菜中产生线程,并且在某种意义上违背了分布式处理的目的。嗯,首先,我看不出它如何能挫败分布式处理的目的,我试图使用芹菜任务运行的代码使用Python内置的多处理。。。所以这并不是一个很有帮助的答案。我碰巧有一个使用多处理的大型代码库,如果我必须重写所有的代码才能使用芹菜,那么芹菜似乎是一个难以置信的工具。嗨,我们使用的是芹菜+多处理方法,当芹菜从多处理套件序列化共享对象时会出现问题。我们改变了它,现在我们决定继续使用基于rq的实现。rq看起来比Cellery+RabbitMQ简单得多,问题也少,每一个都让我头疼不已。
from multiprocessing.dummy import Pool