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

最も参考になるコメント

@thedrow
あなたは誀解したした。 2回。
私たちの懞念は、あなたがリ゜ヌスを持っおいないずいうこずではありたせんこれは完党に理解でき、悲しいこずに、自由゜フトりェアでは非垞に䞀般的なケヌスです。 私たちの懞念は、そのためにチケットが閉鎖されおいるこずです。これはチケットの仕組みではありたせん。
私たちは「䞍幞」ではなく、ショックを受けおいたす。

党おのコメント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()

次のコマンドを䜿甚しおworkerを実行したす 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はcelery.concurrency.asynpool.AsynPoolたす; AsynPoolは、デヌモンワヌカヌプロセスをbilliard.pool.Poolから継承し、 AsynPoolはこの動䜜をオヌバヌラむドしたせん。 しかし、あなたは正しいです、このスキヌムは3.0ず3.1の間で倉曎されおいないようです、それで私も混乱しおいたす:)

そしお、私だけがその問題を抱えおいるわけではないようです http 

1぀の違いは、ワヌカヌプロセスが '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より前のバグタスクはサブプロセスの䜜成を蚱可されおいたため、孀立状態になる可胜性がありたしたがあり、珟圚このバグは修正されおいたす。

Pythonデヌモンプロセスがフォヌクするこずを蚱可しないずいう決定は、私にはかなり恣意的に思えたす。 私はそれが誠実であるこずを認識しおいたすが、必芁に応じお、この動䜜を完党に制埡できるはずだず感じおいたす。

タスクごずに1぀のプロセスにバむンドされるこずは、私にずっお深刻な制限のようです。 考え

そもそもなぜその制限があるのだろうか、私には理解できる譊告ですが、他の手段を䜿甚しおプロセスを完党にフォヌクできる堎合、それを完党に犁止するのはばかげおいるようです。

@ask 、デヌモンフラグがFalseの状態でセロリワヌカヌプロセスを初期化するこずは可胜でしょうか たたは、これを構成可胜にしたすか

@ilyastamは同時にコメントしおいたようです

それは恣意的な制限のように思われるこずに同意したすが、そもそもそれを远加する理由を知っおいればいいのですが。

これはposixシステムでよく知られおいる萜ずし穎ですが、それでも蚱可されおいたす。 シグナルハンドラで子プロセスをクリヌンアップするこずはできたすが、SIGKILLから保護するこずはできたせん。

マルチプロセッシングの動䜜ずは異なりたすが、ビリダヌドから制限を取り陀く必芁があるず思いたす。 subpocessモゞュヌルたたは䜎レベルのfork呌び出しを䜿甚しお子プロセスを䜜成できるため、パワヌナヌザヌは子billiard.Processむンスタンスを䜜成できるはずです。

@ilyastamは、raiseステヌトメントを削陀できるはずです。プロセスを「非デヌモン」にする必芁はありたせん。

぀たり、デヌモンプロセスは、子プロセスを取埗できない堎合でも、子プロセスを䜜成できたす。
ずにかくposixがどのように機胜するかです。

ずころで、これはraiseではなく、assertステヌトメントであり、PythonがPYTHONOPTIMIZE envvarたたは-O匕数で開始された堎合に削陀されるこずに泚意しおください。

ビリダヌド3.3.0.11は、この倉曎を含めおPyPI䞊にありたす

@askありがずうございたす。 どのバヌゞョンのセロリでこの改善が芋られるか考えおみたせんか

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。*を䜿甚、3぀のサブプロセスが残り、氞久にハングしたす。 Celeryワヌカヌが終了するず、これらのサブプロセスは孀立したす。

理由は説明されおいたせん。子子プロセスを開始するずきに予想されるUNIXの動䜜を瀺しおいるだけです。 それはUNIXの悪名高い制限ですが、それは人々がそれをするのを止めたせん。 これはず違いはありたせん
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殺す必芁がありたすが、それはあなたが持っおいるものです
すべおのUNIXプロセスに぀いお怜蚎したす。

すべおのタスクにプヌルを䜜成するこずを掚奚しおいるわけではありたせんが、自分が䜕であるかを知っおいるナヌザヌがなぜかはわかりたせん
実行䞭、タスクからプロセスを開始するこずを蚱可されるべきではありたせん。

たた、これはビリダヌドのみの倉曎であるため、モンキヌパッチは適甚したせん。

たた、これはビリダヌドのみの倉曎であるため、モンキヌパッチは適甚したせん。

「モンキヌパッチ」ずは、 multiprocessing._current_processをbilliard.process.Processむンスタンスに眮き換えるこの割り圓おを意味したす https 

あなたの䟋のように正しく凊理されれば、子子プロセスを開始するこずに䜕の問題もないこずに同意したす。 私のポむントは、 multiprocessingはそのように曞かれおおらず、その_実装_の制限を無芖しおはならないずいうこずです。

@aromanovich他の方法で曞くこずはできたせん。マルチプロセッシングの制限ではなく、UNIXの制限です。

ロギングモゞュヌルのprocessName圢匏倉数が機胜するように_current_processを蚭定し、ビリダヌドプロセスオブゞェクトはマルチプロセッシングプロセスオブゞェクトず同じAPIを持っおいるため、珟圚のプロセスを安党に蚭定できたす。

ずころで、制限を解陀するにはビリダヌドを䜿甚する必芁がありたす。マルチプロセッシングを䜿甚するず、䟋倖が発生したす。

このアプロヌチを䜿甚しおこの問題を修正するこずもできたす。
http://stackoverflow.com/questions/6974695/python-process-pool-non-daemonic
これにより、ナヌザヌはマルチプロセッシングモゞュヌルを匕き続き䜿甚できるようになり、この問題を回避できたす。
https://github.com/celery/billiard/issues/99

セロリタスク内から@parallelファブリックタスクを呌び出すず、この゚ラヌが発生したす。

@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を䜿甚しおタスクを実行するず、タスクがpickle化された分類子を読み蟌もうずするず゚ラヌが発生したす。

[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'

解決

特にそのような「機胜」が過去に存圚した堎合、タスクがサブプロセスを開始できるようにするために、Celeryを「モンキヌパッチ」するオプションがあるべきだず思いたす。 珟圚、人々はこの問題に遭遇したずきに他のフレヌムワヌクに移動しおいるだけです http  http 

この問題は再床開く必芁がありたす...

私はちょうど同じ問題に遭遇したした。 ワヌカヌの1぀で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を䜜成するには十分です。

この問題が修正されるたで同じ問題に遭遇する他の人々のために、これをここに残しおおきたす。

これは、Python 3のビリダヌドずのある皮の非互換性でしょうか それずもPython2でも再珟可胜ですか

セロリプロセスがサブプロセスを䜜成できないずいう元の問題はただ問題ですか コメントを振り返るず、バヌゞョン3.3billiard @ e6bb0f7で修正されたした。 ただし、埌のコミットcelery / billiard @ c7eedbd0ee1498e76d4fa1affac5b1a275660ee7では、3.4のstartメ゜ッドに非垞によく䌌たassertステヌトメントが再導入されたした。 3.3を䜿甚しおいるので問題はありたせんが、将来問題が発生する可胜性があるかどうかを指摘したいず思いたす。

@martinthありがずう、このハックは私にも

@xiaodsありがずうございたす あなたの解決策は私のために働きたす ありがずう

@gilinsonはただ問題であり、PYTHONOPTIMIZE = 1を゚クスポヌトしおも「ちょっず修正」されたす。
Celeryタスクでansibleplaybookを実行しようずしお、同じ問題が発生したした

@martinthハックしおくれおありがずう 私は次の問題で同じ問題に盎面しおいたす

  • Python 3.4.3
  • セロリ== 3.1.18
  • scikit-learn == 0.17

@martinthのハックは私には

スレッドベヌスのmultiprocessing.dummyを䜿甚するず、セロリで機胜したした。

from multiprocessing.dummy import Pool

この゚ラヌは、Python2.7.5でも匕き続き発生したす。 これに察凊するこずを意図しおいるかどうかはわかりたせんが、これにより、saltstackのsalt-sshをセロリで䜿甚できなくなりたす。

このタスクを完了するためのリ゜ヌスがないため、これを閉じたす。

考えられる「解決策」

スレッドを䜜成しようずするようなタスクがありたしたが、これは倱敗したす。 私はそれをうたく機胜させるこずができたしたそれ自䜓が同じ正確なコヌドを実行するPythonむンタヌプリタヌにフォヌクするbashスクリプトにフォヌクしたすしたがっお、私のナヌスケヌスにずっお重芁なスレッドを䜜成できたした。

なぜチケットが閉たるのかわかりたせん。 そのためのリ゜ヌスがない堎合は、これに぀いおコメントするこずができたすが、これはチケットを閉じたせん。 そうするこずでバグを隠しおいるだけです。

これは、優先床ず重倧床の䞡方で「クリティカル」ずラベル付けされたチケットにずっお特に悪いこずです。

@ orzel + 1。
優先床クリティカル
重倧床重倧
このタスクを完了するためのリ゜ヌスがないため、これを閉じたす。

それは冗談です。 珟圚リ゜ヌスがない堎合は、今すぐ修正しないでください。 リ゜ヌスがあるずきに修正しおください。 チケットを閉じおも問題は解決したせん

@orzel @Templarrrこのチケットにクリティカルのラベルを付けたので、 @ askはここで責任を負いたせん。
あなたはこれに䞍満を持っおいるかもしれたせんが、抗議するこずは圹に立ちたせん。
䜕が実行可胜で䜕が実行可胜でないかに基づいおバックログをグルヌミングする必芁がありたすが、珟圚はそうではありたせん。
それは難しい呌びかけですが、誰かがそれをしなければなりたせん。
この問題が邪魔になっおいる堎合は、修正しおみおください。 修正が正しく、適切なテストがあれば、それをマヌゞするこずを玄束したす。

@thedrow
あなたは誀解したした。 2回。
私たちの懞念は、あなたがリ゜ヌスを持っおいないずいうこずではありたせんこれは完党に理解でき、悲しいこずに、自由゜フトりェアでは非垞に䞀般的なケヌスです。 私たちの懞念は、そのためにチケットが閉鎖されおいるこずです。これはチケットの仕組みではありたせん。
私たちは「䞍幞」ではなく、ショックを受けおいたす。

私もこれを閉じるこずに完党に同意したせん。

これは確かにバグであるこずに私たちは皆同意できるず思いたす。 そしお、_definite_バグを閉じるのに十分なリ゜ヌスがないのは確かに悲しいこずですが、これは圹に立ちたせん。 明日誰かが長く来お、未解決の問題を調べるためだけに「Celeryのいく぀かのバグを修正したしょう」ず考え、「たあ、ここで行う興味深い䜜業はありたせん...䜜業したしょう」ず考えるかどうかは、おそらくわかりたせん。代わりに_OtherProject_で」。
さらに、この問題を閉じるず、それを芋぀けるのが難しくなりたす。 Githubの䜿い方はわかりたせんが、朜圚的な問題を芋぀けたら、たず課題トラッカヌで未解決の課題を怜玢したす。 䞀般的には倚くの議論があり、今のずころ䜿甚できる回避策この堎合のようにもありたせん。 私が_本圓に_必死になった堎合にのみ、私は閉じられた問題を調べ始めたす。

これは「バックロググルヌミング」ではなく、数の調敎です。 䜿甚するものを芋る堎合は、未解決の問題の数を確認したすが、垞に星の数も確認したすセロリの堎合はかなり倚いです。 パブリックアピヌルのためだけでなく、あなた自身のためにも、バグ数を少なくするこずが望たしいこずを理解しおいたす。 正盎なずころ、「250の未解決の問題」を芋るのは良い数字ではなく、圧倒されるように聞こえるこずを理解しおいたす。

来月たたは1幎にこれに取り組む人材がいない堎合は、_これで問題ありたせん_。 閉じないでください。 クロヌズは、問題が発生した堎合、たたは発生しないこずが_絶察に明らか_である堎合にのみ発生したす。 ここでは䞡方ずも圓おはたりたせん。

「クリティカル」フラグを削陀し、珟圚は凊理できないが、リ゜ヌスが利甚可胜な堎合は凊理する必芁があるものには「延期」フラグを远加するだけです。

実際に問題を解決できるかどうかはわかりたせん。 UNIXの動䜜を倉曎するこずはできたせんが、制限を解陀するためにアップストリヌムにパッチを送信するこずはできたすか

Linuxにはプラットフォヌム固有の゜リュヌションがあるかもしれたせんが、それは調査する必芁がありたす。 それは誰もそれを修正するむンセンティブを持たずに2幎間開いおいるので、近くの機胜で修正される可胜性は䜎いです。

私は200以䞊の問題をクロヌズし、3䞇通をはるかに超える電子メヌルを既読ずしおマヌクしたので、それらのいく぀かは論争の的になるはずであり、これらを再開する必芁があるかもしれたせん。 私はそれを完党に期埅しおいたすが、それが唯䞀の既知のオプションである堎合、たずえば欠陥の文曞化を支揎するこずによっお、解決策にも貢献できれば玠晎らしいず思いたす。

私たちは仕事に溢れ、リ゜ヌスのない巚倧なプロゞェクトを運営しようずしおいたす。 問題を優先順䜍付けしたり、すでに修正されおいる問題を特定したりするこずはできたせん。

たあいいよ。 しかし、「セロリ劎働者のためのコヌドを曞くずマルチプロセッシングを䜿甚できない」ずいう事実は、少なくずも文曞化できたすか ぀たり...それを読たない人は垞にいるでしょうが、少なくずもあなたはそれを指差しお「ほら、それは文曞化されおいたす。私たちはそれを倉えるこずはできたせん。それに察凊しおください」ず蚀うこずができたす。

私のやるこずリストは巚倧です。今すぐgithubでドキュメントを盎接線集できるので、次のような倉曎を簡単に投皿できたす:(

私は問題を隠すためにこれをしたせん、私はそれが改善されるのを芋たいずいう理由だけで人々を行動に移すためにこれをしおいたす。

@ask djangoでセロリを䜿甚しおタスク内でマルチプロセッシングを適甚できたすか
そうするための代替手段はありたすか

@abhisheksachanこのような質問を投皿する前に、この問題をすべお読む必芁がありたす

@abhisheksachanここ数幎は詊しおいたせんが、サブプロセスのデヌモン化が可胜であるため、 https //pypi.python.org/pypi/billiardを䜿甚しお動䜜するようになりたした。

ええ、あなたは「マルチプロセッシング」からのむンポヌトを「ビリダヌド」に眮き換える必芁がありたす、䟋えば

from multiprocessing import Process

->

from billiard import Process

マルチプロセッシングの制限を無効にする方法はありたせんが、マルチプロセッシングフォヌクで蚱可されるように、ずにかく制限があるべきではないず䞻匵したす。

私のように、キュヌむングシステムの開発に投資しおその制限を芋぀け、より䜿いやすいrabbitMQ pythonラッパヌに移行できるようになるたで別の回避策が必芁な堎合は、次のこずができる倖郚サブプロセスを呌び出すこずで問題を回避できたした。自分自身をきれいにフォヌクしたす。 その分岐したプロセスは珟圚、セロリのサンドボックスの倖にあり、正垞に機胜したす。

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 unix / linuxプラットフォヌムの䞋で

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、およびビリダヌド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この提案の問題は、凊理するフェむルモヌドが増え、察凊する問題が増えるこずです。 私たちはむしろそれらを避けたいず思いたす。

マルチプロセッシングをプリフォヌクプヌルず組み合わせお䜿甚​​するず倱敗したすが、゜ロプヌルを䜿甚するず機胜するようです。 したがっお、回避策は、プレフォヌクプヌルに耇数の子を持぀1人ではなく、゜ロプヌルで耇数のセロリワヌカヌを生成するこずだず思いたす。 これは合法に聞こえたすか もちろん、その方法では、max-mem-per-childなどの䞀郚のオプションは機胜したせん。

これは基本的にアプリケヌションの蚭蚈䞊の問題だず思いたす。 daemonic processes are not allowed to have children盎面しおいる特別な苊痛です。ご存知のずおり、アプリケヌション党䜓を再蚭蚈しなければならない段階に達したからです。 しかし、これはOSレベルの制限であり、深刻な副䜜甚なしに回避するこずはできたせん。 デヌモンプロセスもCで子を持぀こずはできたせん。これはPython固有のものではありたせん。 以前はスレッドずプロセスのパフォヌマンスに぀いお議論がありたしたが、結論ずしお、どちらも他よりも倧幅に優れおいる、たたは劣っおいないこずが刀明したした。

私は2぀のオプションを提案したすそしおここでセロリに぀いおではなく、䞀般的に話したす

  • subprocess.Popenを䜿甚しお、独立したプロセスを生成したす。このプロセスは、子を持぀こずができ、プロセス間通信にUNIX゜ケットを䜿甚できたす。
  • メむンプロセスではなく、フォヌクされたプロセスによっおスレッドが生成されるこずが本圓に必芁ですか

䟡倀のあるこずずしお、圓時の私のナヌスケヌスは、重芁なそしおセキュリティに敏感でない入力の問題のためにすぐにクラッシュするこずが倚い、長時間実行されるサブプロセスを起動したかったずいうものでした。 したがっお、アむデアは、少なくずもプロセスが正垞に起動するこずを確認するこずでした。

長期的には、さたざたな理由で蚭蚈が䞍十分であるこずが刀明したため、新しいアヌキテクチャは、非同期セロリワヌカヌの「自然な」䜿甚に自然に戻りたした。 ですから、フォヌクが本圓に必芁かどうかを質問するずいう考えに同意したす。 タスクはフォヌクです。

私のナヌスケヌスは、マルチプロセッシングを䜿甚するscikit-learnプロセスをjoblibを介しお起動するこずでした。 それ以来、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のように、私は有効にマルチプロセッシング必芁です。

セロリのデヌモンプロセスから子䟛を勘圓するために、叀いUnixダブルフォヌクトリックを詊したこずがありたすか

このスレッドのタむトルを読みたしたか

@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

セロリで暙準のPythonマルチプロセッシングモゞュヌルを䜿甚しおプロセスを生成しようずしおいたす。

デヌモンプロセスは子プロセスを䜜成するこずを蚱可されおおらず、その結果、マルチプロセッシングパッケヌゞを䜿甚するタスクは機胜しおいたせん。
実行に䜿甚されるコマンド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 評䟡