복붙노트

[REDIS] 셀러리 작업이 예외를 발생에서 멀티 프로세싱 풀을 사용하여

REDIS

셀러리 작업이 예외를 발생에서 멀티 프로세싱 풀을 사용하여

그 READING이를 위해 : 나는 멀티 프로세싱 모듈을 사용하는 코드를 실행할 때 실패하지 않는 대신 RQ를 사용하기로 결정했습니다. 당신이 그것을 사용하는 나는 제안한다.

나는 (Mac에서 그것을 실행) 브로커 파이썬 3 레디 스를 사용하여 셀러리 작업 내에서 멀티 프로세싱 풀을 사용하려합니다. 그러나, 나는 심지어 셀러리 작업 내에서 멀티 프로세싱 풀 개체를 만들 수있을 것 없어! 대신에, 나는 진짜로 무엇을 해야할지하지 않는 것이 이상한 예외를 얻을.

사람이 어떻게 이러한 목표를 달성하는 방법을 말해 줄래?

작업:

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

후 다음 파이썬 스크립트를 통해 그것을 실행 :

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'

해결법

  1. ==============================

    1.이 셀러리 알려진 문제입니다. 그것은 당구 의존성에 도입하는 문제에서 유래한다. A-주위 작업은 수동으로 현재 프로세스에 대한 _config 속성을 설정하는 것입니다. 작업 주위에 아래의 사용자 @martinth 감사합니다.

    이 셀러리 알려진 문제입니다. 그것은 당구 의존성에 도입하는 문제에서 유래한다. A-주위 작업은 수동으로 현재 프로세스에 대한 _config 속성을 설정하는 것입니다. 작업 주위에 아래의 사용자 @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_process_init 후크 작업자 프로세스 초기화시 코드를 실행합니다. 우리는 단순히 _config가 존재하는지 확인하고, 그렇지 않은 경우로 설정합니다.

  2. ==============================

    2.빠른 해결책은 스레드 기반의 "더미"멀티 프로세싱 구현을 사용하는 것입니다. 변화

    빠른 해결책은 스레드 기반의 "더미"멀티 프로세싱 구현을 사용하는 것입니다. 변화

    from multiprocessing import Pool  # or whatever you're using
    

    from multiprocessing.dummy import Pool
    

    이 병렬 스레드 기반 그러나 때문에, 일반적인주의 사항 (GIL)이 적용됩니다.

  3. from https://stackoverflow.com/questions/27904162/using-multiprocessing-pool-from-celery-task-raises-exception by cc-by-sa and MIT license