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'
ìŽê²ì 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 íŽí¹ 죌ì ì ê°ì¬í©ëë€! ë€ì곌 ê°ì 묞ì ê° ë°ìí©ëë€.
@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
ê°ì¥ ì ì©í ëêž
ë¿¡ë¿¡
ë¹ì ì ì€íŽíìµëë€. ëë².
ì°ëŠ¬ì êŽì¬ì¬ë ë¹ì ìŽ ììì ê°ì§ê³ ìì§ ìë€ë ê²ìŽ ìëëë€ (ìŽê²ì ì벜íê² ìŽíŽí ì ìê³ ì¬íê²ë ìì ìíížìšìŽìì ë§€ì° íí 겜ì°ì ëë€). ì°ëŠ¬ì ì°ë €ë ê·ž ë묞ì í°ìŒìŽ ë«íê³ í°ìŒìŽ ìëíë ë°©ììŽ ìëëŒë ê²ì ëë€.
ì°ëŠ¬ë 'ë¶í'íì§ ììµëë€. ì°ëŠ¬ë 충격ìë°ìµëë€.