[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.이 셀러리 알려진 문제입니다. 그것은 당구 의존성에 도입하는 문제에서 유래한다. 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.빠른 해결책은 스레드 기반의 "더미"멀티 프로세싱 구현을 사용하는 것입니다. 변화
빠른 해결책은 스레드 기반의 "더미"멀티 프로세싱 구현을 사용하는 것입니다. 변화
from multiprocessing import Pool # or whatever you're using
에
from multiprocessing.dummy import Pool
이 병렬 스레드 기반 그러나 때문에, 일반적인주의 사항 (GIL)이 적용됩니다.
from https://stackoverflow.com/questions/27904162/using-multiprocessing-pool-from-celery-task-raises-exception by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 구성은 sidekiq에 인증을 레디 스 (0) | 2020.01.16 |
---|---|
[REDIS] 어떻게 대량으로 레디 스에서 특수 문자 키의 수천 삭제 수백 (0) | 2020.01.16 |
[REDIS] 로깅 레디 스 (0) | 2020.01.16 |
[REDIS] 나는 파일 / 모듈 간의 레디 스 연결을 공유해야 하는가? (0) | 2020.01.16 |
[REDIS] 레디 스에서 Node.js를의 setTimeout의 반환 값을 저장 (0) | 2020.01.16 |