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()
次ã®ã³ãã³ãã䜿çšããŠ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ããã¯ããŠãããŠããããšãïŒ ç§ã¯æ¬¡ã®åé¡ã§åãåé¡ã«çŽé¢ããŠããŸãïŒ
@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
æãåèã«ãªãã³ã¡ã³ã
@thedrow
ããªãã¯èª€è§£ããŸããã 2åã
ç§ãã¡ã®æžå¿µã¯ãããªãããªãœãŒã¹ãæã£ãŠããªããšããããšã§ã¯ãããŸããïŒããã¯å®å šã«ç解ã§ããæ²ããããšã«ãèªç±ãœãããŠã§ã¢ã§ã¯éåžžã«äžè¬çãªã±ãŒã¹ã§ãïŒã ç§ãã¡ã®æžå¿µã¯ããã®ããã«ãã±ãããééãããŠããããšã§ããããã¯ãã±ããã®ä»çµã¿ã§ã¯ãããŸããã
ç§ãã¡ã¯ãäžå¹žãã§ã¯ãªããã·ã§ãã¯ãåããŠããŸãã