Celery: 작업읎 하위 프로섞슀륌 시작할 수 없습니닀.

에 만든 2013년 11월 29음  Â·  68윔멘튞  Â·  출처: celery/celery

Celery 3.1.0부터 프로섞슀 풀 ( celery.concurrency.prefork , 읎전 celery.concurrency.processes )은 데몬 프로섞슀륌 사용하여 작업을 수행합니닀.

데몬 프로섞슀는 자식 프로섞슀륌 만듀 수 없윌므로 multiprocessing 팚킀지륌 사용하는 작업읎 작동하지 않습니닀.

[2013-11-29 14:27:48,297: ERROR/MainProcess] Task app.add[e5d184c0-471f-4fc4-804c-f760178d4847] raised exception: AssertionError('daemonic processes are not allowed to have children',)
Traceback (most recent call last):
  File "/Users/aromanovich/Envs/celery3.1/lib/python2.7/site-packages/celery/app/trace.py", line 218, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/Users/aromanovich/Envs/celery3.1/lib/python2.7/site-packages/celery/app/trace.py", line 398, in __protected_call__
    return self.run(*args, **kwargs)
  File "/Users/aromanovich/Projects/celery/app.py", line 10, in add
    manager = multiprocessing.Manager()
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/__init__.py", line 99, in Manager
    m.start()
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 524, in start
    self._process.start()
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 124, in start
    'daemonic processes are not allowed to have children'
Not a Bug

가장 유용한 댓Ꞁ

ë¿¡ë¿¡
당신은 였핎했습니닀. 두번.
우늬의 ꎀ심사는 당신읎 자원을 가지고 있지 않닀는 것읎 아닙니닀 (읎것은 완벜하게 읎핎할 수 있고 슬프게도 자유 소프튞웚얎에서 맀우 흔한 겜우입니닀). 우늬의 우렀는 ê·ž 때묞에 티쌓읎 닫히고 티쌓읎 작동하는 방식읎 아니띌는 것입니닀.
우늬는 '불행'하지 않습니닀. 우늬는 충격을받습니닀.

몚든 68 댓Ꞁ

읎것은 3.0곌 3.1 사읎에서 변겜되지 않았윌므로 지ꞈ읎 였류가 발생하는 읎유륌 잘 몚륎겠습니닀.

읎것읎읎 였류륌 재현 할 수있는 방법입니닀.

app.py :

import multiprocessing
from celery import Celery

app = Celery(__name__, broker='amqp://192.168.33.40')
@app.task
def f():
    manager = multiprocessing.Manager()

sendtask.py :

import app

app.f.delay()

닀음 명령을 사용하여 작업자륌 싀행합니닀. celery worker -A app.app -l debug .

Celery 3.0.24로 작업 성공 :

[2013-12-02 20:43:56,454: INFO/MainProcess] Task app.f[bcaab028-dbec-43a8-9259-ff7c35ff13d0] 
succeeded in 0.0169339179993s: None

Celery 3.1.5에서는 닀음을 수행하지 않습니닀.

[2013-12-02 20:48:38,946: ERROR/MainProcess] Task app.f[c9f1cdd3-ae38-493e-b7c7-b9636ed473d0] 
raised exception: AssertionError('daemonic processes are not allowed to have children',)

묞제에 대한 나의 읎핎는 닀음곌 같습니닀. celery.concurrency.prefork.TaskPool uses celery.concurrency.asynpool.AsynPool ; AsynPool 는 데몬 작업자 프로섞슀 륌 billiard.pool.Pool 에서 상속되며 AsynPool 는읎 동작을 재정의하지 않습니닀. 하지만 당신 말읎 맞습니닀.읎 계획은 3.0곌 3.1 사읎에서 변겜되지 않은 것 같습니닀. 귞래서 저도 혌란 슀럜습니닀. :)

귞늬고 나는 ê·ž 묞제에 대핮 혌자가 아닌 것 같습니닀 : http://stackoverflow.com/questions/20149421/threads-in-celery-3-1-5

한 가지 찚읎점은 작업자 프로섞슀가 읎제 'Process'의 하위 큎래슀띌는 것입니닀. 여Ʞ서 핚수 읞수 Process(target=) 사용하Ʞ 전에 읎러한 ì ‘ê·Œ 방식의 Ʞ볞값에 찚읎가있을 수 있습니닀.

멀티 프로섞싱 및 읎전 버전의 당구 섞튞 daemon=True :
https://github.com/celery/billiard/blob/2.7/billiard/pool.py#L904

최신 버전에서도 동음합니닀.
https://github.com/celery/billiard/blob/3.3/billiard/pool.py#L1039

데몬 읞 작업 프로섞슀는 작업 구현에 심각한 제한읎 있닀고 생각합니닀.
CPU 바욎드 작업 속도륌 높읎Ʞ 위핎 닀쀑 처늬륌 사용하는 작업을 작성했습니닀. 닀음곌 같읎 터믞널에서 작업자륌 시작하멎 몚든 것읎 잘 작동합니닀.

셀러늬 작업자 --app = tasks -Q wb -l info --concurrency = 1

귞러나 celeryd 슀크늜튞륌 사용하여 작업자륌 시작하멎 닀음 예왞가 발생합니닀.
AssertionError : 데몬 프로섞슀는 자식을 가질 수 없습니닀.

나는 행동 변화의 원읞을 알아 냈닀.
작업은 3.0곌 3.1 몚두에서 데몬 프로섞슀륌 사용하여 싀행되지만 celery / billiard @ 4c32d2e 및 https://github.com/celery/billiard/commit/c676b94aa4144349b11ab31c82296a5d804909c9 multiprocessing 몚듈읎읎륌 읞식하지 못했Ʞ 때묞에 하위 프로섞슀 생성을 허용했습니닀.

낮 읎핎에 따륎멎 버전 3.1 읎전에는 버귞가 있었윌며 (작업읎 하위 프로섞슀륌 생성 할 수 있었Ʞ 때묞에 고아 상태가 될 수 있음) 읎제읎 버귞가 수정되었습니닀.

파읎썬 데몬 프로섞슀륌 포크하지 ì•Šêž°ë¡œ 한 결정은 나에게 닀소 임의적 읞 것 같습니닀. 나는 귞것에 대한 선의륌 읞정하지만, ë‚Žê°€ 선택한닀멎읎 행동을 완전히 통제 할 수 있얎알한닀고 생각합니닀.

작업 당 하나의 프로섞슀에 묶여 있닀는 것은 나에게 심각한 제한 읞 것 같습니닀. 생각?

왜 ê·ž 제한읎 처음에 졎재하는지 궁ꞈ합니닀. 닀륞 수닚을 사용하여 프로섞슀륌 완벜하게 포크 할 수있을 때 ë‚Žê°€ 읎핎할 수는 있지만 완전히 허용하지 않는 것은 얎늬석은 것처럌 볎입니닀.

@ask , 데몬 플래귞가 False 읞 셀러늬 작업자 프로섞슀륌 쎈Ʞ화 할 수 있습니까? 아니멎읎륌 구성 가능하게 만드시겠습니까?

@ilyastam 우늬가 동시에 댓Ꞁ을

나는 귞것읎 임의의 제한처럌 볎읞닀는 데 동의하지만, 처음에 귞것을 추가하는 읎유륌 알았 윌멎 좋겠닀.

읎것은 posix 시슀템에서 잘 알렀진 핚정읎지만 여전히 허용됩니닀. 신혞 처늬Ʞ에서 자식 프로섞슀륌 정늬할 수 있지만 SIGKILL로부터 볎혞하지는 않습니닀.

멀티 프로섞싱 동작에서 벗얎나더띌도 당구에서 제한을 제거핎알한닀고 생각합니닀. 여전히 subpocess 몚듈을 사용하거나 하위 수쀀 fork 혞출을 사용하여 하위 프로섞슀륌 만듀 수 있윌므로 고꞉ 사용자는 하위 billiard.Process 읞슀턎슀륌 만듀 수 있얎알합니닀.

@ilyastam raise 묞을 제거 할 수 있얎알하며 프로섞슀륌 "데몬읎 아닌"프로섞슀로 만듀 필요는 없습니닀.

슉, 데몬 프로섞슀는 자식 프로섞슀륌 거둘 수 없더띌도 생성 할 수 있습니닀.
얎욌든 posix가 작동하는 방식입니닀.

Btw, 읎것은 raise 가 아니띌 assert 묞입니닀. 파읎썬읎 PYTHONOPTIMIZE envvar 또는 -O 읞수로 시작되멎 제거됩니닀.

billiard 3.3.0.11은읎 변겜 사항을 포핚하여 PyPI에 있습니닀.

@ 감사합니닀. ì–Žë–€ 버전의 셀러늬가읎 개선을 볌 수 있을지 아십니까?

multiprocessing 묞서 는 데몬 프로섞슀가 하위 프로섞슀륌 만듀 수 없음을 명시하고 ê·ž 읎유륌 섀명합니닀. 저 에게읎 assert 묞은 raise 대한 바로 가Ʞ로 여Ʞ에 추가 된 것처럌 볎입니닀 (사람듀은 종종 귞렇게합니닀).

읎 제한은 묞서화되얎 있윌며 Celery가 조용히 multiprocessing 원숭읎 팚치륌 적용하여 제거하는 것은 좋은 생각읎 아니띌고 생각합니닀. 정말 예상치 못한 핎로욎 결곌륌 쎈래할 수 있습니닀.

닀음 예제륌 생각할 수 있습니닀 (하지만 앜간 읞위적윌로 볎음 수 있습니닀).

@app.task
def f():
    p = multiprocessing.Pool(3)
    p.map_async(time.sleep, [1000, 1000, 1000])

음반 Python 핚수로 싀행되므로읎 ​​윔드는 올바륎게 작동합니닀. 귞러나 Celery 작업 (Celery 버전 3.0. * 사용)윌로 싀행되멎 영원히 쀑닚되는 ì„ž 개의 하위 프로섞슀가 낚습니닀. Celery 작업자가 종료되멎 읎러한 하위 프로섞슀가 분늬됩니닀.

읎유는 섀명하지 않고 자식-자식 프로섞슀륌 시작할 때 예상 할 수있는 유닉슀 동작 만 섀명합니닀. 유닉슀에서 악명 높은 제한읎지만 사람듀읎 귞렇게하는 것을 막지는 못합니닀. 읎것은 닀륎지 않습니닀
subprocess.Popen 프로섞슀륌 시작하거나 fork() 륌 혞출하여 새 프로섞슀륌 시작합니닀. 귞렇닀멎 왜 불법읎얎알합니까?

예제륌 수행하는 방법 :

from billiard import Pool
from multiprocessing.util import Finalize

_finalizers = []

@app.task
def f():
    p = billiard.Pool(3)
    _finalizers.append(Finalize(p, p.terminate))
   try:
       p.map_async(time.sleep, [1000, 1000, 1000])
       p.close()
       p.join()
   finally:
       p.terminate()

읎것을 (-9) 죜읎Ʞ 위핎서는 자식 프로섞슀도 -9 죜여알합니닀.
몚든 유닉슀 프로섞슀륌 고렀합니닀.

몚든 작업에 대핮 풀 생성을 옹혞하는 것은 아니지만 사용자가 자신읎 묎엇읞지 아는 읎유는 알 수 없습니닀.
작업에서 프로섞슀륌 시작하도록 허용핎서는 안됩니닀.

또한, 우늬는 원숭읎 팚치륌하지 않습니닀. 읎것은 당구에만있는 변화입니닀.

또한, 우늬는 원숭읎 팚치륌하지 않습니닀. 읎것은 당구에만있는 변화입니닀.

"원숭읎 팚치"란 multiprocessing._current_process 륌 billiard.process.Process 의 읞슀턎슀로 대첎하는읎 할당을 의믞합니닀. https://github.com/celery/billiard/blob/master/billiard/process.py # L53.

나는 (귀하의 예에서와 같읎) 올바륎게 처늬되멎 자식-자식 프로섞슀륌 시작하는 데 아묎런 묞제가 없닀는 데 동의합니닀. 낮 요점은 multiprocessing 가 귞렇게 작성되지 않았윌며 _implementation_ 제한 사항을 묎시핎서는 안된닀는 것입니닀.

@aromanovich 닀륞 방법윌로 ì“ž 수 없윌며 닀쀑 처늬의 제한읎 아니띌 유닉슀의 제한입니닀.

로깅 몚듈 processName 형식 변수가 작동하도록 _current_process륌 섀정하고 당구 프로섞슀 개첎는 닀쀑 처늬 프로섞슀 개첎와 동음한 API륌 가지므로 현재 프로섞슀륌 섀정하는 것읎 안전합니닀.

귞늬고 btw, 당신은 제한을 핎제하Ʞ 위핎 당구륌 사용핎알 할 것입니닀. 닀쀑 처늬륌 사용하멎 여전히 예왞가 발생합니닀.

읎 방법을 사용하여읎 묞제륌 í•Žê²°í•  수도 있습니닀.
http://stackoverflow.com/questions/6974695/python-process-pool-non-daemonic
읎렇게하멎 사용자가 닀쀑 처늬 몚듈을 계속 사용할 수 있윌므로읎 묞제륌 방지 할 수 있습니닀.
https://github.com/celery/billiard/issues/99

셀러늬 작업 낎에서 @parallel fabric 작업을 혞출 할

@celery.task
def dostuff():
   execute(fabfile.push_settings, sid=site['sid'])

<strong i="7">@parallel</strong>
@roles(environment)
def push_settings(sid):
  #do stuff

@frodopwns 는 ENV륌 사용합니닀.
PYTHONOPTIMIZE = 1 낎볎낎Ʞ
읎 죌장을 제거합니닀. 몚든 것을 처늬핎알합니닀.

@xiaods 나는 닀음곌 같은 묞제륌 핎결했닀고 생각합니닀.

@worker_process_init.connect
def configure_workers(sender=None, conf=None, **kwargs):
    Crypto.Random.atfork()

묞제

음부 데읎터륌 계산하고 핎당 데읎터륌 Ʞ반윌로 예잡을 수행하Ʞ 위핎 scikit-learn 분류Ʞ륌로드하는 작업읎 있습니닀. 작업을 닚독윌로 싀행하멎 몚든 것읎 정상읎지만 Celery륌 사용하여 싀행하멎 작업읎 절읞 분류Ʞ륌로드하렀고 할 때 였류가 발생합니닀.

[2015-07-17 21:23:51,299: ERROR/MainProcess] Task app.f[329d0da4-2e0e-4e1f-8148-d64f47750b1f] raised unexpected: AttributeError("'Worker' object has no attribute '_config'",)
Traceback (most recent call last):
  File "/home/username/anaconda3/lib/python3.4/site-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/username/anaconda3/lib/python3.4/site-packages/celery/app/trace.py", line 438, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/username/working/playground/celery/app.py", line 11, in f
    clf = pickle.load(open('clf.pickle', 'rb'))
  File "/home/username/anaconda3/lib/python3.4/site-packages/sklearn/ensemble/__init__.py", line 6, in <module>
    from .base import BaseEnsemble
  File "/home/username/anaconda3/lib/python3.4/site-packages/sklearn/ensemble/base.py", line 13, in <module>
    from ..externals.joblib import cpu_count
  File "/home/username/anaconda3/lib/python3.4/site-packages/sklearn/externals/joblib/__init__.py", line 112, in <module>
    from .parallel import Parallel
  File "/home/username/anaconda3/lib/python3.4/site-packages/sklearn/externals/joblib/parallel.py", line 23, in <module>
    from ._multiprocessing_helpers import mp
  File "/home/username/anaconda3/lib/python3.4/site-packages/sklearn/externals/joblib/_multiprocessing_helpers.py", line 25, in <module>
    _sem = mp.Semaphore()
  File "/home/username/anaconda3/lib/python3.4/multiprocessing/context.py", line 81, in Semaphore
    return Semaphore(value, ctx=self.get_context())
  File "/home/username/anaconda3/lib/python3.4/multiprocessing/synchronize.py", line 127, in __init__
    SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX, ctx=ctx)
  File "/home/username/anaconda3/lib/python3.4/multiprocessing/synchronize.py", line 59, in __init__
    kind, value, maxvalue, self._make_name(),
  File "/home/username/anaconda3/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'

재현하렀멎

빈 분류Ʞ륌 만듀고 플큎로 저장합니닀.

import pickle
from sklearn.ensemble import GradientBoostingClassifier
clf = GradientBoostingClassifier()
pickle.dump(clf, open('clf.pickle', 'wb'))

ê°„ë‹ší•œ 앱 만듀Ʞ ( app.py ) :

import pickle
import sklearn
from celery import Celery

app = Celery(__name__, broker='amqp://localhost//')

@app.task
def f():
    print('hello')
    clf = pickle.load(open('clf.pickle', 'rb'))
    print(clf)

셀러늬 작업자륌 시작하십시였.

celery -A app worker --loglevel=debug

앱 싀행 :

python -c "from app import f; f.delay()"

에러 메시지:

...
AttributeError: 'Worker' object has no attribute '_config'

í•Žê²°ì±…

특히 곌거에 귞러한 "Ʞ능"읎 졎재했닀멎 작업읎 하위 프로섞슀륌 시작할 수 있도록 "monkeypatch"Celery 옵션읎 있얎알한닀고 생각합니닀. 현재 사람듀은읎 묞제가 발생하멎 닀륞 프레임 워크로 읎동하고 있습니닀. http://stackoverflow.com/questions/27904162/using-multiprocessing-pool-from-celery-task-raises-exception. 닀음은읎 였류의 또 닀륞 예입니닀. http://stackoverflow.com/questions/22674950/python-multiprocessing-job-to-celery-task-but-attributeerror.

읎 묞제는 닀시 엎얎알합니닀 ...

나는 방ꞈ 같은 묞제에 부딪쳀닀. 낮 작업자 쀑 하나에서 nltk 륌) 사용하고 있습니닀. 귞러멎 scikit-learn 륌 가젞와 @ostrokach가 볎여쀀 것곌 동음한 였류가 발생합니닀.

닀음 윔드로읎 묞제륌 í•Žê²°í•  수있는 것 같습니닀.

from celery.signals import worker_process_init

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

읎것은 분명히 맀우 조잡한 핎킹읎며 싀제로 닀쀑 처늬륌 사용하멎 얎떻게 될지 몚륎겠지만 ( semprefix 읎 묎엇읞지조찚 몚늅니닀) scikit-learn 륌 만드는 것윌로 충분합니닀

읎 묞제가 í•Žê²° 될 때까지 같은 묞제륌 겪는 닀륞 사람듀을 위핎 여Ʞ에 낚겚 두겠습니닀.

읎것읎 파읎썬 3의 당구와 ì–Žë–€ 종류의 비 혞환성음까요? 아니멎 Python 2에서도 재현 할 수 있습니까?

셀러늬 프로섞슀의 원래 묞제가 하위 프로섞슀륌 만듀 수없는 것읎 여전히 묞제입니까? 댓Ꞁ을 삎펎볎멎 버전 3.3의 겜우 celery / billiard @ e6bb0f7 로 수정되었습니닀. 귞러나 읎후 컀밋 (celery / billiard @ c7eedbd0ee1498e76d4fa1affac5b1a275660ee7)은 3.4의 start 메서드에 맀우 유사한 assert 묞을 닀시 도입했습니닀. 나는 3.3에 있Ʞ 때묞에 묞제가 없지만 앞윌로 묞제륌 음윌킬 수 있는지 지적하고 싶었습니닀.

@martinth 감사합니닀,읎 핎킹은 저에게도 횚곌적입니닀!

@xiaods 감사합니닀! 귀하의 솔룚션읎 저에게 횚곌적입니닀! 감사!

@gilinson 여전히 묞제읎며 PYTHONOPTIMIZE = 1 낎볎낎Ʞ는 여전히 "좀 수정"합니닀.
Celery 작업에서 ansible 플레읎 북을 싀행하렀고 시도하멎서 동음한 묞제가 발생했습니닀.

@martinth 핎킹 죌셔서 감사합니닀! 닀음곌 같은 묞제가 발생합니닀.

  • 파읎썬 3.4.3
  • 셀러늬 == 3.1.18
  • scikit-learn == 0.17

@martinth 의 핎킹은 나륌 위핎 작동하지 않윌며, 음부 계산 속도륌 높읎Ʞ 위핎 닀쀑 처늬륌 사용하렀고 시도했습니닀. 대신 슀레딩 몚듈을 사용했윌며 여전히 처늬륌 쀑닚 하멎서읎 였류륌 완화하는 것 같습니닀.

슀레드 êž°ë°˜ multiprocessing.dummy륌 사용하멎 셀러늬에서 작업했습니닀.

from multiprocessing.dummy import Pool

읎 였류는 파읎썬 2.7.5에서도 여전히 발생합니닀. 읎 묞제륌 í•Žê²°í•  의도읞지 확싀하지 않지만 읎로 읞핎 saltstack의 salt-ssh륌 셀러늬와 핚께 사용할 수 없게됩니닀.

읎 작업을 완료 할 늬소슀가 없Ʞ 때묞에읎 작업을 마묎늬합니닀.

가능한 í•Žê²°ì±…"

슀레드륌 생성하렀는 작업읎 있었는데 싀팚했습니닀. 나는 귞것을 작동하도록 ꎀ늬했닀 : 똑같은 윔드륌 수행하는 파읎썬 읞터프늬터로 포크하는 bash 슀크늜튞로 포크 (따띌서 낮 사용 사례에 쀑요한 슀레드륌 만듀 수 있음).

티쌓읎 닫힌 읎유륌 읎핎하지 못합니닀. 읎에 대한 늬소슀가없는 겜우 읎에 대핮 댓Ꞁ을 달 수 있지만 티쌓읎 종료되지는 않습니닀. 당신은 귞렇게하는 버귞륌 숚Ʞ는 것입니닀.

읎는 우선 순위와 심각도 몚두에서 "쀑요"띌고 표시된 티쌓에 특히 나쁩니닀.

@orzel +1.
우선 순위 : 쀑요
심각도 : 위험
읎 작업을 완료 할 늬소슀가 없Ʞ 때묞에읎 작업을 마묎늬합니닀.

농닎입니닀. 지ꞈ 늬소슀가 없닀멎 지ꞈ 고치지 마십시였. 자원읎있을 때 수정하십시였. 티쌓을 닫아도 묞제가 핎결되지는 않습니닀.

@orzel @Templarrr 나는읎 티쌓을 Critical로 분류 했윌므로 @ask 가 여Ʞ에서 비난하지 않습니닀.
당신은 읎것에 대핮 불행 할 수 있지만 시위는 도움읎되지 않습니닀.
우늬는 싀행 가능한 것곌 귞렇지 않은 것곌 현재는 귞렇지 않은 것을 Ʞ반윌로 ë°± 로귞륌 정늬핎알합니닀.
힘든 전화륌 걞지만 누군가는핎알합니닀.
읎 묞제가 방핎가되는 겜우 핎결핎볎십시였. 수정 사항읎 정확하고 적절한 테슀튞가 있윌멎 병합하겠닀고 앜속합니닀.

ë¿¡ë¿¡
당신은 였핎했습니닀. 두번.
우늬의 ꎀ심사는 당신읎 자원을 가지고 있지 않닀는 것읎 아닙니닀 (읎것은 완벜하게 읎핎할 수 있고 슬프게도 자유 소프튞웚얎에서 맀우 흔한 겜우입니닀). 우늬의 우렀는 ê·ž 때묞에 티쌓읎 닫히고 티쌓읎 작동하는 방식읎 아니띌는 것입니닀.
우늬는 '불행'하지 않습니닀. 우늬는 충격을받습니닀.

나는 또한 읎것을 닫는 것에 완전히 동의하지 않습니닀.

나는 우늬 몚두가 읎것읎 싀제로 버귞띌는 데 동의 할 수 있닀고 생각합니닀. 귞늬고 _definite_ 버귞륌 닫는 데 도움읎되지 않는 늬소슀가 충분하지 않닀는 것은 정말 슬픈 음입니닀. 낎음 누군가가 였래 와서 "셀러늬의 버귞륌 고치자"띌고 생각하고 믞핎결 묞제륌 삎펎볎고 "Ꞁ쎄요, 여Ʞ서 할 흥믞로욎 음읎 없습니닀 ... 대신 _OtherProject_에 ".
또한읎 묞제륌 닫윌멎 ì°Ÿêž°ê°€ 더 얎렀워집니닀. Github륌 얎떻게 사용하는지 몚륎겠지만 잠재적 읞 묞제륌 발견하멎 뚌저 읎슈 튞래컀에서 엎늰 읎슈륌 검색합니닀. 음반적윌로 녌의가 많고 지ꞈ 당장 사용할 수있는 í•Žê²° 방법도 없습니닀 (읎 겜우와 같읎). ë‚Žê°€ _ 정말 _ 절망적 음 때만 나는 닫힌 묞제륌 삎펎볎Ʞ 시작한닀.

읎것은 "ë°± 로귞 귞룚밍"읎 아니띌 숫자 조정입니닀. ë‚Žê°€ 사용할 것을 볎멎 믞핎결 묞제 수륌 _do_ 뎅니닀.하지만 항상 별 수 (셀러늬의 겜우 상당히 높음)도 뎅니닀. 나는 대쀑의 혞소뿐만 아니띌 당신 자신을 위핎서도 버귞 수륌 쀄읎는 것읎 바람직하닀는 것을 읎핎합니닀. 솔직히 "250 개의 믞핎결 묞제"륌 볎는 것은 좋은 숫자가 아니며 압도적윌로 듀늬는 것을 읎핎합니닀.

닀음 달 (또는 1 년)에읎 작업을 수행 할 읞력읎 없닀멎 _ ꎜ찮습니닀 _. 닫지 마섞요. 종결은 묞제가 완료되거나 _ 절대 완료되지 않을 것임읎 _ 절대적윌로 명확한 _ 겜우에만 발생핎알합니닀. 둘 ë‹€ 여Ʞ서는 귞렇지 않습니닀.

"Critical"플래귞륌 제거하고 지ꞈ 처늬 할 수 ​​없지만 늬소슀 _are_륌 사용할 수있는 겜우 처늬핎알하는 몚든 항목에 대핮 "Postponed"플래귞륌 추가하멎됩니닀.

싀제로 묞제륌 í•Žê²°í•  수 있을지 몚륎겠습니닀. 유닉슀 작동 방식을 변겜할 수는 없지만 제한을 핎제하Ʞ 위핎 업슀튞늌 팚치륌 제출할 수 있습니까?

Linux에 플랫폌 별 솔룚션읎있을 수 있지만 연구가 필요합니닀. 2 년 동안 누구에게도 ê³ ì¹  읞섌티람없읎 ì—Žë € 있윌므로 가까욎 Ʞ능에서 ê³ ì¹  가능성읎 낮습니닀.

저는 200 개 읎상의 묞제륌 닫고 3 만 개가 넘는 읎메음을 읜은 것윌로 표시했Ʞ 때묞에 음부는 녌쟁의 여지가 있윌며읎륌 닀시 ì—Žì–Žì•Œ 할 수도 있습니닀. 나는 귞것을 완전히 Ʞ대하지만 우늬가 핎결책에 Ʞ여할 수 있닀멎 좋을 것입니닀. 예륌 듀얎 귞것읎 유음한 알렀진 옵션읎띌멎 결핚을 묞서화하는 것을 돕는 것입니닀.

우늬는 자원없읎 거대한 프로젝튞륌 욎영하Ʞ 위핎 녞력하고 있습니닀. 묞제륌 분류하거나 읎믞 수정 된 묞제륌 찟을 수 없습니닀.

음 .. 좋아. 귞러나 "셀러늬 작업자륌위한 윔드륌 작성하멎 멀티 프로섞싱을 사용할 수 없습니닀"띌는 사싀읎 적얎도 묞서화 될 수 있습니까? 낮 말은 ... 항상 귞것을 읜지 않는 사람듀읎있을 것읎지만 적얎도 당신은 귞것을 가늬킀고 "뎐, 귞것은 묞서화되었습니닀. 우늬는 귞것을 바꿀 수 없습니닀. 귞것을 처늬하십시였."띌고 말할 수 있습니닀.

낮 할 음 목록은 엄청납니닀. 읎제 github에서 묞서륌 직접 펞집 할 수 있윌므로 닀음곌 같은 변겜 사항을 Ʞ여하는 것읎 정말 쉜습니닀.

나는 묞제륌 숚ꞰꞰ 위핎읎 음을하는 것읎 아니띌 개선되는 것을볎고 싶Ʞ 때묞에 사람듀을 정확하게 행동윌로 끌얎 듀읎Ʞ 위핎읎 음을합니닀.

@ask django에서 celery륌 사용하여 작업 낎부에 닀쀑 처늬륌 적용 할 수 있습니까?
귞렇게 할 수있는 대안읎 있습니까?

@abhisheksachan 귞런 질묞을 게시하Ʞ 전에읎 몚든 묞제륌 읜얎알합니닀

@abhisheksachan 나는 몇 년 동안 읎것을 시도하지 않았지만 하위 프로섞슀의 데몬 화륌 허용하Ʞ 때묞에 https://pypi.python.org/pypi/billiard륌 사용하여 작동했습니닀.

예, '닀쀑 처늬'에서 가젞옚 가젞 였Ʞ륌 '당구'로 바꿔알합니닀. 예륌 듀멎 닀음곌 같습니닀.

from multiprocessing import Process

->

from billiard import Process

닀쀑 처늬 제한을 비활성화 할 수있는 방법은 없지만 얎욌든 제한읎 있얎서는 안된닀고 죌장하므로 닀쀑 처늬 포크가 허용합니닀.

저륌 좋아하는 사람은 대Ʞ엎 시슀템 개발에 투자했습니닀. _BEFORE_ ê·ž 제한 사항을 알아 ë‚Žê³  더 유용한 rabbitMQ 파읎썬 래퍌로 마읎귞레읎션 할 수있을 때까지 닀륞 í•Žê²° 방법읎 필요합니닀. 깚끗하게 포크하십시였. 분Ʞ 된 프로섞슀는 읎제 셀러늬 샌드 박슀 왞부에 있윌며 정상적윌로 작동합니닀.

OP 예에서 닀음을 바꿉니닀.

app = Celery(__name__, broker='amqp://192.168.33.40') 
@app.task
def f():
    manager = multiprocessing.Manager()

와:

app = Celery(__name__, broker='amqp://192.168.33.40')
@app.task
def f():
    process = subprocess.Popen(["program"]) # or the newer post 3.5 run version
    process.wait()
    # analyze exit code

"프로귞랚"은 닀음곌 같습니닀 (POSIX 유닉슀 / 늬눅슀 플랫폌에서).

import os

def main():
      manager = multiprocessing.Manager()

# this is equivalent to "(cmd )&" under bash
pid = os.fork()
if pid == 0:
    cpid = os.fork()
    if cpid == 0:
        main()
    else:
        exit(0)
else:
    os.wait(pid)

CPU ꎀ늬는 셀러늬륌 사용한닀는 생각에 얎Ꞌ나는 셀러늬의 범위륌 벗얎나지 만 닀쀑 처늬륌 사용하렀는 겜우 얎욌든 셀러늬 왞부에서 CPU 사용을 처늬하고 싶을 것입니닀.

최소한 ê·ž 제한은 묞서화되얎알합니닀. 묞서륌 둘러 볎았지만 찟을 수 없었습니닀.

닀시 말하지만, 묞서 변겜 사항곌 핚께 풀 요청을 자유롭게 제출하십시였.

@martinth 의 의견 에 따띌 Python 3.5.2, Celery 4.0.0 및 billiard 3.5.0에 대한 귞의 솔룚션은 작동하지 않았습니닀. 닀쀑 처늬가 데몬 화되는 프로섞슀륌 확읞하고 자식을 시작하지 못하도록 막Ʞ 때묞입니닀.

작업자의 데몬 플래귞륌 재섀정하여 제한을 í•Žì œ 할 수있었습니닀. 나는 귞것읎 나쁜 생각읎띌고 확신하지만 셀러늬 작업 낎에서 닀쀑 처늬륌 시작할 수 있습니닀.

@worker_process_init.connect
def fix_multiprocessing(**kwargs):
    # don't be a daemon, so we can create new subprocesses
    from multiprocessing import current_process
    current_process().daemon = False

슉, IMHO Celery는 작업자륌 데몬윌로 시작할지 여부륌 구성하는 묞서화 된 옵션을 추가핎알합니닀. ì°žê³  저는 k8 포드에서 셀러늬륌 사용하고 있윌므로 셀러늬는 celery worker 사용하여 포 귞띌욎드 프로섞슀로 시작되며 데몬 화 된 작업자 가 필요 하지 않습니닀.

@miraculixx 읎 제안의 묞제는 처늬 할 싀팚 몚드와 í•Žê²°í•Žì•Œ 할 묞제가 더 많닀는 것입니닀. 찚띌늬 플하고 싶습니닀.

멀티 프로섞싱을 프늬 포크 풀곌 핚께 사용하멎 싀팚하지만 솔로 풀을 사용하멎 작동하는 것 같습니닀. 따띌서 í•Žê²° 방법은 프늬 포크 풀에 여러 자녀가있는 셀러늬 작업자가 아닌 솔로 풀로 여러 셀러늬 작업자륌 생성하는 것입니닀. 합법적윌로 듀늜니까? 묌론 귞렇게하멎 max-mem-per-child와 같은 음부 옵션읎 작동하지 않습니닀.

읎것은 Ʞ볞적윌로 응용 프로귞랚 디자읞 묞제띌고 생각합니닀. daemonic processes are not allowed to have children 직멎 한 특별한 고통입니닀. 아시닀시플 전첎 애플늬쌀읎션을 닀시 디자읞핎알하는 시점에 도달했Ʞ 때묞입니닀. 귞러나 귞것은 OS 레벚 제한읎며 심각한 부작용 없읎는 플할 수 없습니닀. 데몬 프로섞슀는 또한 C에서 자식을 가질 수 없습니닀. 읎것은 파읎썬곌 ꎀ렚된 것읎 아닙니닀. 쓰레드 대 프로섞슀 성능에 대한 녌쟁읎 있었는데, 결론적윌로 얎느 것도 닀륞 것볎닀 훚씬 더 좋거나 나쁘닀는 것읎 밝혀지지 않았습니닀.

두 가지 옵션을 제안합니닀 (여Ʞ서 셀러늬가 아니띌 음반적윌로 읎알Ʞ).

  • subprocess.Popen 륌 사용하여 자식을 가질 수 있고 프로섞슀 간 통신을 위핎 UNIX 소쌓을 사용할 수있는 독늜 프로섞슀륌 생성합니닀.
  • 슀레드가 Ʞ볞 프로섞슀가 아닌 분Ʞ 된 프로섞슀에 의핎 생성되는 것읎 정말로 필요합니까?

귞만한 가치가있는 겜우, ê·ž 당시의 사용 사례는 사소하지 않은 (귞늬고 볎안에 믌감하지 않은) 입력 묞제로 읞핎 종종 빠륎게 충돌하는 장Ʞ 싀행 하위 프로섞슀륌 시작하고 싶었습니닀. 귞래서 아읎디얎는 적얎도 프로섞슀가 성공적윌로 시작되었는지 확읞하는 것읎 었습니닀.

장Ʞ적윌로 여러 가지 읎유로 섀계 불량윌로 판명되었윌므로 새로욎 아킀텍처는 자연슀럜게 비동Ʞ 셀러늬 작업자의 "자연슀러욎"사용윌로 되돌아갔습니닀. 귞래서 나는 포크가 정말로 필요한지에 대한 질묞에 동의합니닀. 태슀크는 포크입니닀.

귞만한 가치륌 위핎, 낮 사용 사례는 (joblib륌 통핎) 닀쀑 처늬륌 사용하는 scikit-learn 프로섞슀륌 시작하는 것읎 었습니닀. 나는 읎후로 joblib에 대한 셀러늬 백엔드륌 개발했습니닀. 슉, scikit-learn은 셀러늬륌 사용하여 병렬 프로섞슀륌 시작하고 위의 핎킹읎 더 읎상 필요하지 않습니닀. 읎것은 POC 닚계에 있윌며 아직 황ꞈ 시간대가 아닙니닀.

@miraculixx 읎걎 얎딘가에 혞슀팅 했나요? 삎펎 볎거나 시도핎볎고 싶습니닀. 저는 여러분곌 동음한 묞제읞 sklearn 슀폰 하위 프로섞슀에 직멎하고 있윌며 Ʞ볞적윌로 Celery륌 포Ʞ했습니닀.

@pgeez sklearn 에서 하위 프로섞슀륌 사용하지 않윌렀멎 환겜 변수 JOBLIB_MULTIPROCESSING = 0을 섀정할 수 있습니닀. https://github.com/scikit-learn/scikit-learn/blob/0.18.X/sklearn/externals/joblib/_multiprocessing_helpers.py ì°žì¡°

@jennaliu 생각에 감사하지만 @miraculixx 처럌 멀티 프로섞싱을 활성화핎알합니닀.

셀러늬의 데몬 프로섞슀에서 아읎듀을 거부하Ʞ 위핎 였래된 유닉슀 더뾔 포크 튾멭 을 시도핎 볎셚습니까?

읎 슀레드의 제목을 읜었습니까?!?!?

@sebastroy 분명히 수년 동안읎 슀레드륌 따띌 왔습니닀. 방ꞈ 읎쀑 포크륌 발견했지만 읎제는 데몬 포크가 샐러늬에 의핎 죜임을 당하고 있닀고 생각하는 것읎 혌란 슀러웠습니닀.

알았얎. 예 전생에 저는 C륌 사용하고 있었Ʞ 때묞에 읎것은 빵곌 버터 같았습니닀.

ë‚Žê°€ 사용하는 í•Žê²° 방법은 잘 작동하는 subprocess.Popen읎지만 셀러늬가 뚌저 수행핎알하는 음부 녌늬륌 닀시 구현하고 프로귞랚의 ì…ž 버전을 만듀얎알합니닀. 하지만 최상위 API 구현의 동작을 변겜하여 수정했습니닀. 셀러늬의 목적곌 더 음치한닀고 생각합니닀. 너묎 낮은 수쀀의 로직도 닚순화하십시였.

닀행히도 Celery 작업에서 ansible 플레읎 북을 싀행하렀고 할 때읎 묞제륌 발견합니닀.
@martinth 가 제공 한 방법은 저에게 current_process()._config 읞쇄하고
{'authkey': b"y&e\x8d'\xcb\xd4\r\xd2\x86\x06\xe7\x9e\x14\xaf \xbc\xc4\x95\xa5G\xec&[i\x19\xf3G-\x06\xac\x19", 'semprefix': '/mp', 'daemon': True}
귞런 닀음 daemon 필드륌 False 닀시 할당하멎 작동합니닀.

작업에서 닀쀑 프로섞슀륌 싀행할 수있는 몇 가지 솔룚션 또는 Ʞ타 구현읎 있습니까?

@HeartUnchange : 최귌 우늬는 분산 구성 요소로 셀러늬륌 사용하고자하는 빅 데읎터 프로젝튞륌 엎심히 진행하고 있습니닀. 귞늬고 당신의 가읎드와 핚께, 우늬는 묞제륌 핎결하게되얎 욎읎 좋습니닀. 작업 구성을 찞조하십시였.

     @app.task
    def handleBigZipfile(filename,nid):
    current_process()._config['daemon'] = False
    logger.info('{} begin handle!'.format(filename))
    handleAll(filename,nid)
     logger.info('{} is done!'.format(filename))

핎결책은 ꎜ찮습니닀! 2017.1에서 프로젝튞륌 시작하고 읎제 프로토 타입읎 완성되었습니닀! 9 개월읎 지났습니닀! 나는 당신에게 감사합니닀! 귞늬고 낮 감사는 표현할 수 없습니닀!
묞제륌 얎떻게 파악했는지 자섞히 섀명핎 죌시겠습니까? 우늬는 귞것을 알고 싶얎합니닀!

안녕하섞요 ,

나는 ꜀ 표쀀적읞 섀정을 가지고있닀 : Django + Rabbitmq + celery-4.0.2 + python-2.7 + centOS-7

셀러늬에서 표쀀 파읎썬 닀쀑 처늬 몚듈을 사용하여 프로섞슀륌 생성하렀고합니닀.

데몬 프로섞슀는 자식 프로섞슀륌 만듀 수 없윌며 결곌적윌로 닀쀑 처늬 팚킀지륌 사용하는 작업읎 작동하지 않습니닀.
싀행에 사용 된 명령 : celery worker -B -A celery_task -l debug
역 추적 로귞 :

[2017-09-26 23:27:08,838: WARNING/PoolWorker-2] ERROR
[2017-09-26 23:27:08,839: WARNING/PoolWorker-2] Traceback (most recent call last):
[2017-09-26 23:27:08,839: WARNING/PoolWorker-2] File "/home/induser/config.py", line 612, in main
[2017-09-26 23:27:08,840: WARNING/PoolWorker-2] mylog_process = mp.Process(target=test_logger_process, args=(myqueue,))
[2017-09-26 23:27:08,840: WARNING/PoolWorker-2] File "/usr/lib64/python2.7/multiprocessing/process.py", line 98, in __init__
[2017-09-26 23:27:08,841: WARNING/PoolWorker-2] self._authkey = _current_process._authkey
[2017-09-26 23:27:08,841: WARNING/PoolWorker-2] AttributeError: 'Process' object has no attribute '_authkey'

프로섞슀륌 생성하지 않는 읎유는 묎엇음까요?
닀음은 윔드입니닀.

import multiprocessing as mp
from celery.schedules import crontab
from celery.decorators import periodic_task

@periodic_task(run_every=crontab(minute='*/1'), name='test_process_celery')
def main():
data = config_read()
try:
    myqueue = mp.Queue(-1)
    mylog_process = mp.Process(target=test_logger_process, args=(myqueue,))
    mylog_process.start()
    . . .
    . . .
except Exception as e:
    raise
finally:
    mylog_process.join()

감사합니닀.

마슀터륌 시도하고 여전히 묞제읞지볎고하십시였.

여전히 였류가 있습니닀. 닀음곌 핚께 하위 프로섞슀륌 사용하렀고했습니닀.

from multiprocessing import Process, Value
import ctypes

[...]
        result = Value('i', 0)
        text = Value(ctypes.c_char_p, fail_string.encode())
        p = Process(target=reader.find_text_async, args=(result, text, ))
        p.start()
        p.join(5)

        if p.is_alive():
            logging.WARNING("Manual terminating the process 'find_text_async'")
            p.terminate()

귞러나 셀러늬 마슀터 람랜치 에서는 닀음곌 같읎 말합니닀.

파음 "/usr/lib/python3.5/multiprocessing/process.py", 103 행, 시작
'데몚닉 프로섞슀는 자녀륌 가질 수 없습니닀'
AssertionError : 데몬 프로섞슀는 자식을 가질 수 없습니닀.

펞집하닀

당구로 멀티 프로섞싱을 변겜했는데 횚곌가 있습니닀!

from billiard import Process, Value

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉