celerybeatã®ã€ã³ã¹ã¿ã³ã¹ãã¯ã©ã¹ã¿ãŒå šäœã«1ã€ã ãååšããããšããŠãŒã¶ãŒã«èŠæ±ãããšãå®è£ ã«å€§ããªè² æ ãããããŸãïŒåäžé害ç¹ãäœæãããããŠãŒã¶ãŒã«ç¬èªã®åæ£ãã¥ãŒããã¯ã¹ãããŒã«ããããã«ä¿ããŸãïŒã
celerybeatã¯ãäžæ³šæã«ããåæå®è¡ãé²æ¢ããã¡ã«ããºã ãæäŸããããããã¥ã¡ã³ãã§ãã¹ããã©ã¯ãã£ã¹ã®ã¢ãããŒããææ¡ããå¿ èŠããããŸãã
ããã¯ã kombu.pidbox
ã䜿çšããããšã§è§£æ±ºã§ããŸããããã¯ãåãååã®ããŒãããã§ã«å®è¡ãããŠããããšãceleryd
æ€åºããæ¹æ³ã§ããããŸãã celerybeat
ã¯äžå
åãããŠãããããåºå®ããŒãåã䜿çšã§ããŸãã
å¯äœçšãšããŠããªã¢ãŒãã³ã³ãããŒã«ã³ãã³ãã§celerybeatãå¶åŸ¡ã§ããããã«ãªããŸãïŒããšãã°ãã¹ã±ãžã¥ãŒã«ããªããŒãããããè¿ãå°æ¥ã«äºå®ãããŠããã¿ã¹ã¯ã確èªãããããã³ãã³ããããå¯èœæ§ããããŸãïŒã ããªããç§ã«å°ããã°ãããã¯ããªãçŽ æŽãããå¯äœçšã§ãã
åãã¯ã©ã¹ã¿ãŒã§è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ãããŠãŒã¹ã±ãŒã¹ããããããããã«èšç»ãå¿ èŠã§ãã ããšãã°ãã¹ã±ãžã¥ãŒã«ãè€æ°ã®éšåã«ãã·ã£ãŒãã£ã³ã°ãããå Žåã å°ãªããšããã€ã³ã¹ã¿ã³ã¹ããšã«ããŒãåãéžæã§ããå¯èœæ§ãå¿ èŠã§ãã 2.3.0ã«å»¶æããŸãã
celerybeat
å®è¡ããŠããããã¯ã¹ããªãã©ã€ã³ã«ãªããæ°ããcelerybeat
ã€ã³ã¹ã¿ã³ã¹ãéå§ããããã®é©åãªãã©ãŒã«ããã¯ãè¡ãããã«ãªãã©ã€ã³ã«ãªããšããåé¡ããããŸããã celerybeat
ãå®è¡ããããã®æšå¥šãããHAã®æ¹æ³ã¯äœã§ããïŒ
kombu.pidbox
ã¢ãããŒãã§ã¯ã celerybeat
è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ã§ããŸããïŒã€ã³ã¹ã¿ã³ã¹ãåºå®ããŒãåã§ãã§ã«å®è¡ãããŠããããšãæ€åºããå Žåã¯ã¹ãªãŒãç¶æ
ã«ãªããããŒãªã³ã°ããŠã¢ã¯ãã£ãã«ææ ŒããŸããã€ã³ã¹ã¿ã³ã¹ãããŠã³ããŸããïŒ
è€æ°ã®ã¢ã¯ãã£ããªã€ã³ã¹ã¿ã³ã¹ãå®è¡ããããšã¯èå³æ·±ãããã«æããŸã-ã¹ã±ãžã¥ãŒã«ãå ±æããããšã«å ããŠãä»ã«ã©ã®ãããªå©ç¹ããããŸããïŒ
+1
+1
ããã¯ãã¹ã±ãžã¥ãŒãªã³ã°ã®åŸ©å åãéèŠã§ãã倧èŠæš¡ãªãããã€ã«ãšã£ãŠçã®æžå¿µäºé ã§ãã
+9999;ïŒ
kombu.pidbox
ãœãªã¥ãŒã·ã§ã³ã®äœ¿çšã«äœãåé¡ããããŸããïŒ ã·ã£ãŒãã£ã³ã°ãšæŽŸæãªæ©èœããªããŠããããã¯çŽ æŽããããéåžžã«äŸ¿å©ã§ãã ä»ãå¥ã®ãã¹ãã§celerybeatãæåã§éå§ããå¿
èŠããããŸãã
Pidboxã䜿çšããããšãã§ããŸãããåé¡ã¯ããŒããã³ã³ã·ã¥ãŒããŒã§ã¯ãªãããšã§ãã ãããã«ããŒãã€ã³ã¹ã¿ã³ã¹ã¯ãããŸããïŒãã®ãããªãããŒããã£ã¹ãã¡ãã»ãŒãžã«å¿çããã«ã¯ãããŒããã£ã¹ããã¥ãŒã§ã¡ãã»ãŒãžãåžžã«ãªãã¹ã³ããå¿ èŠããããŸãããã¡ãã»ãŒãžã®ã¹ã±ãžã¥ãŒã«ãå¿ãããããçŸåšã¯ãªãã¹ã³ã§ããŸããã
æè¡çã«ã¯ã2çªç®ã®ã¹ã¬ããã䜿çšããŠããå¯èœæ§ããããŸãããããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ãããããã®æ©èœã®ããã ãã«å€ãã®ãªãŒããŒããããçºçããŸãã
2çªç®ã®è§£æ±ºçã¯ãããã¯ã䜿çšããããšã§ãããããã¯ã解é€ããå¿ èŠããããšããæ¬ ç¹ããããŸãã ã€ãŸããããŒãããã»ã¹ã匷å¶çµäºãããå Žåãå€ãããã¯ã§ã¯ãæ°ããã€ã³ã¹ã¿ã³ã¹ãéå§ããããã«æåã§ä»å ¥ããå¿ èŠããããŸãã
ãŸããããã¯ã«2ç§ã®ã¿ã€ã ã¢ãŠããããã1ç§ããšã«ããã¯ãæŽæ°ããããšãã§ããŸãã ã€ãŸããããã¯ãä¿æãããŠããå Žåãæ°ããã€ã³ã¹ã¿ã³ã¹ã¯2ç§éåŸ æ©ããå¿ èŠããããŸãã
amqpã®ããã¯ã¯ããã¥ãŒã宣èšããããšã§äœæã§ããŸããäŸïŒ `queue_declareïŒ 'celerybeat.lock'ãarguments = {'x-expires'ïŒ2000}` `
+1
ãããèŠããã§ã
+1
+1
+1ã
+1
誰ããå®éã«kombu.pidbox
ãœãªã¥ãŒã·ã§ã³ãŸãã¯ãã®åé¡ã解決ããä»ã®ã¡ã«ããºã ãå®è£
ããŸãããïŒ ãããããªãããããå
±æããŠãã ããã ãŸã ãã¹ããã©ã¯ãã£ã¹ãäœã§ãããçåã«æã£ãŠãã人ã¯ããããããŸãã
ãããåå ã§ã»ããªããå®å šã«é¢ãã人ã¯ããŸããïŒ ãããç¥ãããã§ãã
ç·šéïŒ
ãã®èŠç¹ïŒhttps://gist.github.com/winhamwr/2719812ïŒã¯ãGoogleãã£ã¹ã«ãã·ã§ã³ïŒhttps://www.google.co.in/search?q=celerybeat+lock&aq=f&oq=celerybeat+lock&aqs=ïŒã§èŠã€ããŸããã chrome.0.57j62l3.2125j0ïŒsourceid = chromeïŒie = UTF-8ïŒã
ãŸãã誰ããcelerybeatã«å
±æpidfileãçŽæ¥äœ¿çšããããšãããã®ã§ã¯ãªãããšæããŸãããããããAWSã®EBSã§ããŸãã¯S3ãã±ããã§âŠ celerybeat --pidfile=/path/to/shared/volume
ã
çŸåšã®ãã¹ã¿ãŒïŒ3.1 devïŒã«ã¯ãã³ã³ã·ã¥ãŒããŒåãã®ãŽã·ããã¹ããããããããšã«æ°ã¥ããŸããã ãŽã·ãããã¥ãŒãšãªãŒããŒéžåºã掻çšããŠãåã蟌ãŸããããŒãããã»ã¹ã調æŽããããšã¯å¯èœã§ããããïŒ ã€ãŸããåã¯ãŒã«ãŒã¯åã蟌ã¿ããŒãããã»ã¹ãå®è¡ããŸããããªãŒããŒã®ã¿ãå®æçãªã¿ã¹ã¯ããã¥ãŒã«å ¥ããŸãã ããã¯ãå ±æã¹ã±ãžã¥ãŒã«ã¹ãã¬ãŒãžãæ³å®ããŠããå¯èœæ§ããããŸãã
@mlavinããã¯æ©èœããå¯èœæ§ããããŸããããããŒããã£ã¹ãããµããŒããããããŒã«ãŒãã©ã³ã¹ããŒãã®å Žåã®ã¿ã§ã
pidboxãœãªã¥ãŒã·ã§ã³ã®åé¡ã¯ãéåæI / Oã䜿çšããããã«celerybeatããã°ã©ã ãæžãçŽãå¿
èŠãããããšã§ãã
ã¹ã±ãžã¥ãŒã©ãŒããããã¯ããŠãããããçŸåšãã¿ã¹ã¯ã®æ¶è²»ãšçæã®äž¡æ¹ãè¡ãããšã¯ã§ããŸããã
ã»ãšãã©ã®å Žåãããã¯å¿
èŠãªæ©èœã§ã¯ãããŸãããã»ãšãã©ã®æ¬çªç°å¢ã«ã¯ããŒãããã»ã¹å°çšã®ãã¹ãããããè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãéå§ããªãããã«ããã«ã¯ã --pidfile
ã䜿çšããã ãã§ååã§ãã
ãã®åé¡ã®åœ±é¿ãåããã®ã¯ãããŒã¢ã³åã§-B
ãªãã·ã§ã³ã䜿çšãã人ã§ããããšããããããŸãã
ã¹ã¯ãªãããäœæãããã®èšå®ãå¥ã®ãã¹ãã«è€è£œããŸãã
ã ããç§ã¯ãããè¿·æã ãšæããŸãããããã¯éèŠã§ã¯ãªããšæããŸãã 誰ããæ¬åœã«è§£æ±ºçãæãã§ãããªãã圌ãã¯ãããè²¢ç®ããããç§ãéã/å¯ä»ããŠãããå®è£ ããããšãã§ããŸãã
uWSGIã䜿çšããŠãä»ã®ããŒããžã®ãã©ãŒã«ããã¯ã䌎ãã·ã³ã°ã«ããŒãããã»ã¹ãå®è¡ã§ããŸãã
+1ãåäžã®Amazon EC2ã€ã³ã¹ã¿ã³ã¹ãèµ·åãã1ã€ã®ããŒãã§ã®ã¿å®è¡ãããå®æçãªã¿ã¹ã¯ããããšäŸ¿å©ã§ãã ãã®éãç§ã¯ææ¡ã«æè¬ããŠuWSGIã䜿çšããããšããŸãã
+1
+1
ç§ã¯ä»äºã§Celerybeatãã¹ã±ãžã¥ãŒã«ã«äœ¿çšããããšã䞻匵ããŠããŸããããHAãããã«äœ¿çšã§ããªããããéåžžã«å°é£ã«ãªã£ãŠããŸãã å®éããããåå ã§å®å šã«åé€ãããããã§ãã éåžžã«ç°¡åã«èšãã°ã1ã€ã®Celerybeatã€ã³ã¹ã¿ã³ã¹ã®ã¿ãå®è¡ãããšããããåäžé害ç¹ã«ãªããããæ¬çªç°å¢ã«å¯Ÿå¿ã§ããªããªããŸãã
@junaidchããã§ã»ããªãèœãšãã¹ãã§ã¯ãªããšæããŸãã ãã€ã§ããã¹ãŠã®ãµãŒããŒã§ã¹ã±ãžã¥ãŒã©ãŒãå®è¡ã§ããŸããå®æçãªã¿ã¹ã¯ã®å Žåã¯ãäœããã®ããã¯ã¡ã«ããºã ã䜿çšããŠãéè€ããªãããã«ããé »ç¹ã«å®è¡ããªãããã«ããŸãã ããã«ãã¹ã±ãžã¥ãŒã©ãŒããµãã¯ã©ã¹åããŠããã§ããã¯ãå®è¡ããããšããã¿ã¹ã¯ã¬ãã«ã®ããã¯ãã¹ãããããŠã¹ã±ãžã¥ãŒã©ãŒã§ãã¹ãŠãå®è¡ããããšãã§ããŸãã
ããã¯äžçš®ã®åé¿çã§ãããããã»ããªã«ããã€ãã®çµã¿èŸŒã¿æ©èœããããšäŸ¿å©ã§ãããããã§ãæ¬çªç°å¢ã§åé¡ãªã䜿çšã§ããŸãã
@ 23doorsã«æè¬ããŸãã
ç§ã®ã¿ã¹ã¯ã¯ãã¿ã¹ã¯ã®å¥ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ãããªãããã«ããã§ã«Redisããã¯ãç¶æããŠããŸãã 2ã€ã®ç°ãªããã·ã³ã§2ããŒããå®è¡ããã¿ã¹ã¯ã5åééã§ã¹ã±ãžã¥ãŒã«ãããŠããå Žåãäž¡æ¹ã®ããŒããã¿ã¹ã¯ããã¥ãŒã«ããã·ã¥ããŠããŠããããã¯æ©èœãããšæããŸãã ã³ã¢æ©èœã®åé¿çãå®è£ ããå¿ èŠãããå Žåãæ¡çšã®ã±ãŒã¹ãäœæããã®ã¯ããã«é£ãããªããŸãã
ãµãã¯ã©ã¹ã®æšå¥šäºé ã調æ»ããŸãã ããã¯ããã¯ãªãŒã³ãªã¢ãããŒããããããŸããã
ææ¡ãããããšãïŒ
Luluã§ã¯ãåçŽãªã¯ã©ã¹ã¿ãŒã·ã³ã°ã«ãã³ãããŒãžã£ãŒïŒBeatCopãšããååïŒãäœæããããšã§ããã解決ããŸããã æéåãã®Redisããã¯ã䜿çšããŠãCeleryã¯ãŒã«ãŒã®èªåã¹ã±ãŒãªã³ã°ããŒã«ã§å®è¡ãããŠããCelerybeatã1ã€ã ãã§ããããšã確èªããŸãã ãã®Celerybeatã«äœããèµ·ãã£ãå ŽåïŒã€ã³ã¹ã¿ã³ã¹ãã¹ã±ãŒã«ã¢ãŠããããããåæ¢ããããCelerybeatãã¯ã©ãã·ã¥ããããããªã©ïŒãå¥ã®ããŒããèªåçã«æ°ããCelerybeatãçæããŸãã BeatCopã
@ingmaråãçç±ã§ãã®https://github.com/ybrs/single-beatãäœæããŸããããååãã§ãã¯ãããšãã«ã³ã¡ã³ãã衚瀺ãããŸããã§ããã ãªãŒãã³ãœãŒã¹ãä»ã®äººã«ã圹ç«ã€ãããããªãã®ã§ãç§ãã¡ã¯ãŸããªãªãŒã¹ããŸããã å€ããå°ãªããåãããšãããŸãã
ç§ãèŠãéããbeatcopãšã®äž»ãªéã-ãpyuvã䜿çšããŠããŸã-ãããã£ãŠãbeatcopã¯ãã移æ€æ§ãé«ããäŸåé¢ä¿ãå°ãªããšæããŸã-ãåã®stderrãšstdoutã芪ãšããŠãªãã€ã¬ã¯ãããåãåãã³ãŒãã§æ»äº¡ããå Žåã¯çµäºãã次ã®ããã«æ§æããŸãç°å¢å€æ°ã ãã®ãããã¹ãŒããŒãã€ã¶ãŒã«è¿œå ããã®ã¯å°ãç°¡åã§ãã
ãããä»ã®èª°ãã«åœ¹ç«ã€ãããããªãããšãé¡ã£ãŠããŸãã
+1
+1
é äºã®ããŒå€ãããã¯ã³ã³ãããŒã©ãŒãšããŠäœ¿çšããããšãæ€èšããŠããŸããã誰ãããã®ã¢ãããŒããè©ŠããŸãããïŒ ãããã£ãŠã1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãæ©èœããŠããéãä»ã®ã€ã³ã¹ã¿ã³ã¹ã¯ããã¯ãæŽæ°ãããªããªããŸã§ãã¹ãªãŒãããããã®åŸãé äºéžæã¡ã«ããºã ãã¿ã€ã ã¹ã¿ã³ãä»ãã®ããŒå€ãæŽæ°ããã®ã¯èª°ãã決å®ããŸãã ããã¯ãæŽæ°ãã人ã¯èª°ã§ãæ©èœããŸãã
@ingmarããããšãããããŸãïŒ ãããã¯ãŒã«ãŒã¯ã©ã¹ã¿ãŒã§è©ŠããŠã¿ãŸãã
çŸåšã®å®è£ ãšããŠã®+10ã¯ãæåã«åæ£ãã¥ãŒã䜿çšããçç±ããé¢ããåäžé害ç¹ãæå³ããŸã
+1
+1
ããã¯v5.0.0ã«å«ãŸããããã§ãhttps://github.com/celery/celery/milestones/v5.0.0
+1
ãããéãããšãçŸåšã®ãªãœãŒã¹ãšåæ§ã«ãå®äºãããŸã§ã«10幎ããããŸãã
ç³ãèš³ãããŸããããããã¯ãããããåæ£ããã¥ãŒã«ãšã£ãŠæ·±å»ãªåé¡ã§ãã ãããå®è£ ããã®ã«ã©ãã ãæéãããããšããŠããæçµçã«ã¯ä¿®æ£ããå¿ èŠããããŸãã _çŸåš_ãªãœãŒã¹ããªããããå®å šã«æå¹ãªåé¡ã解決ããããšã¯æ£ãããªãããã§ãã ããäžåºŠéããŠãçŸæç¹ã§åªå 床ãäœãããšã瀺ãã©ãã«ã貌ã£ãŠããã ããŸãããã
ç§ã®ééã®çç±ãã°ãããŠçªç¶ã ã£ãã®ã¯ç¥ã£ãŠããã®ã§ããœãããŠã§ã¢ã®ãŠãŒã¶ãŒãšããŠç§ã¯ããªãã®ææ ãç解ããããšãã§ããŸãããæè¡çã«ã¯Beatã¯ã¢ããªã³æ©èœã®ãããªãã®ã§ãã ããã¯Celeryã®ä»ã®éšåããå®å šã«åãé¢ãããŠãããå®è£ ãåçŽã«ä¿ã€ããã«ãæå³çã«éåæ£ã«ãªãããã«èšèšãããŠããŸãã ããã¯ãPythonããã®cronãžã§ãããã§ã«Celeryã䜿çšããŠãããŠãŒã¶ãŒãžã®ããŒãã¹ãšããŠå®çŸ©ããããã®å·§åŠãªæ¹æ³ãšããŠå§ãŸãããã®åŸããŸããŸãå€ãã®äººã ãCeleryãcronã®ä»£æ¿ãšããŠäœ¿çšããŸããã
ãã®åé¡ã¯6幎ééãããŠãããé »ç¹ã«èŠæ±ãããç¡æ°ã®äŒæ¥ãããã«äŸåããŠããŸãããå®è£ ã«ãéãæãããšãç³ãåºãäŒæ¥ã¯ãããŸããã
ããã¯å®éãäŒæ¥ãåŸæŽããã®ã«èå³æ·±ããšç§ãèããåé¡ã®1ã€ã§ããã 確ãã«ãäŒæ¥ãæ©èœããã°ä¿®æ£ãããã«ã¯æ¬çªç°å¢ã®åé¡ã®è§£æ±ºãæ¯æŽããããã«ãéãæãããšãç³ãåºãã®ã¯äžè¬çã§ã¯ãããŸããã ç§ã¯ããããäžæ¹ã§ããããæ°ããããšãã§ããŸãïŒããªãã¯çŽ æŽãããã§ãïŒã®ã§ãä»ç§ã¯ãã®ã¢ã€ãã¢ãã©ãã»ã©çŽ æŽã§ãã£ãããç¥ã£ãŠããŸã:)
ä»æ¥ããã®åé¡ã®è€è£œãéããŸãããïŒ1495ãåç §ããŠãã ããã ãã®åé¡ã解決ããããšãããã«ãªã¯ãšã¹ãããããããã€ãã¯ææã§ãããç¹å®ã®å®è£ ãæ©èœããããšã蚌æããããã«å¿ èŠãªç®èº«ãèãããšãç§ã¯ãŸã ããããé©åã«ã¬ãã¥ãŒããæéããããŸããã§ããã ãã¶ããããã¯èª°ããè¡åã«ç§»ãã§ããããããšãããã§ãªããŠãã誰ãããã«åãçµãã§ããªããšãã«æ©èœãªã¯ãšã¹ãã6幎ééãããŸãŸã«ããŠããããã¯ãŸãã ãšæããŸãã ããã¯ããããä¿®æ£ãããããšãæãã§ãããŠãŒã¶ãŒã«ãšã£ãŠãäžçš®ã®äžå©çã§ãã
@askãŸããŸãã ä»ã®ã¹ã¬ããã§èšãããã«ãåæ£cronãéåžžã«è€éãªåé¡ã§ããããšã¯äºå®ã§ãã ãããŠãããã¯ã»ããªã®å€ã«äœãã¹ããã®ã®ããã«èãããŸãã
æéãå²ããŠãçç±ã詳ãã説æããŠããã ãããããšãããããŸãã
@askã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ããŒãã§å
±æãããŠããNFSããªã¥ãŒã å
ã«celerybeat-schedule
ãã¡ã€ã«ïŒ celery.beat.PersistentScheduler
ïŒãé
眮ããããšã§ããã®åé¡ãåé¿ã§ãããã©ããçåã«æã£ãŠããŸãããïŒ
PersistentScheduler
ã¯ã©ã¹ã¯ããŒã¿ããŒã¹ã¢ãžã¥ãŒã«ãšããŠshelve
ã䜿çšããããã celerybeat-schedule
ãã¡ã€ã«ãžã®åææžã蟌ã¿ã¯èšèšäžé²æ¢ããå¿
èŠããããŸãã ããã¯shelve
ããã¥ã¡ã³ãããã®æç²ã§ãïŒ
ã·ã§ã«ãã¢ãžã¥ãŒã«ã¯ãã·ã§ã«ãããããªããžã§ã¯ããžã®åæèªã¿åã/æžã蟌ã¿ã¢ã¯ã»ã¹ããµããŒãããŠããŸããã ïŒè€æ°ã®åæèªã¿åãã¢ã¯ã»ã¹ã¯å®å šã§ããïŒããã°ã©ã ã«æžã蟌ã¿çšã«éããŠããã·ã§ã«ããããå Žåãä»ã®ããã°ã©ã ã§ã¯èªã¿åããŸãã¯æžã蟌ã¿çšã«éããŠã¯ãªããŸããã
ãã®ããã«ã»ããªããŒããéå§ãããšä»®å®ããŸãã
celery -A project-name beat -l info -s /nfs_shared_volume/celerybeat-schedule
/nfs_shared_volume
ãå
±æããªã¥ãŒã ïŒAWS Elastic File Systemã«ãã£ãŠç®¡çããããªã©ïŒã§ããå Žåãã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ããŒãã§1ã€ã®ã»ããªããŒãããã»ã¹ãå®è¡ãããŠããŠããã¹ã±ãžã¥ãŒã«ãå°ç¡ãã«ãªããªãããšãæåŸ
ã§ããŸããïŒ
@mikeschaekermannããã¥ã¡ã³ããæ£ããèªãã§ããå Žåã shelve
ã¯åææžã蟌ã¿ã¢ã¯ã»ã¹ãé²ãããã®åªåãããŠããŸããã ããã¯ããªãã«ãããèµ·ããããªãããã«èšãã ãã§ãã ããªããåŒçšããã»ã¯ã·ã§ã³ã§ã¯ããUnixãã¡ã€ã«ããã¯ã䜿çšããŠããã解決ã§ããŸãããããã¯UnixããŒãžã§ã³ã«ãã£ãŠç°ãªãã䜿çšããããŒã¿ããŒã¹å®è£
ã«é¢ããç¥èãå¿
èŠã§ãããšç¶ããŠããŸãã
@ ze-phyr-usããªããæ£ãããšæããŸãããããŠç§ã¯shelve
ããã¥ã¡ã³ãã誀解ããŸããã ããã§ãã Scheduler
ããã¯ãšã³ããã¹ã±ãžã¥ãŒã«ã©ããã®äžå¯åæäœãä¿èšŒãããšä»®å®ããŠãåé¡ã解決ããããã©ããçåã«æã£ãŠããŸããïŒ @ask django-celery-beat
ããã±ãŒãžã¯ãåé¡ã解決ããããã«ã¢ãããã¯æ§ããµããŒãããŠããŸããïŒ ããã€ãã®æŽæ°ãè¡ãããã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠããããšãããããŸããã
åæ£å/èªåã¹ã±ãŒãªã³ã°ã«é©ããã»ããªããŒããæ€çŽ¢ããŠãããšãã«ããã«è¡ãçããRedisãããã¯ãšã³ããšããŠäœ¿çšããŠæºè¶³ããŠããä»ã®äººã®ããã«ã äžèšã®BeatCopãšã·ã³ã°ã«ããŒãã®äž¡æ¹ãè©ŠããŸããããæçµçã«ã¯RedBeatãéžã³
ããã«ã¡ã¯@ddevlin
ç§ãåæ§ã®åé¡ãæ±ããŠããŸãããã·ã³ã°ã«ããŒãã䜿çšããŠãããšãã«ã©ã®ãããªåé¡ã«çŽé¢ããŸãããïŒ ãŸããå€ãããªãå Žåã¯ãè€æ°ã®ãµãŒããŒã«å¯ŸããŠredbeatãæ§æããæ¹æ³ã®å®è£
ãµã³ãã«ãå
±æããŠãã ããã
@ ankur11ã·ã³ã°ã«ããŒãã¯ãã»ããªããŒãã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãå®è¡ãããŠããããšãä¿èšŒããŸãããã€ã³ã¹ã¿ã³ã¹éã§ã¹ã±ãžã¥ãŒã«ç¶æ ãåæããŸããã
15åããšã«å®è¡ããããšãç®çãšããå®æçãªã¿ã¹ã¯ã§ããã©ã«ãã®ã¹ã±ãžã¥ãŒã©ãŒã䜿çšããã¿ã¹ã¯ãæåŸã«å®è¡ãããŠãã14ååŸã«ã·ã³ã°ã«ããŒãã§ãã§ã€ã«ãªãŒããŒããå Žåãã¿ã¹ã¯ã¯æ°ããã»ããªããŒãã®15ååŸãŸã§å®è¡ãããŸããã§ãããã€ã³ã¹ã¿ã³ã¹ãéå§ããã29åã®ã®ã£ãããçºçããŸããã
ã€ã³ã¹ã¿ã³ã¹éã§ã¹ã±ãžã¥ãŒã«ç¶æ ãå ±æããã«ã¯ãå¥ã®ã¹ã±ãžã¥ãŒã©ãŒã䜿çšããå¿ èŠããããŸããã django-celery-beatã¯Celeryã®ããã¥ã¡ã³ãã«èšèŒãããŠãã代æ¿æ段ã§ããããã§ã«RedisãCeleryããã¯ãšã³ããšããŠäœ¿çšããŠãããããã¹ã±ãžã¥ãŒã«åæã®ããã¯ãšã³ããšããŠRedisã䜿çšããããšã奜ã¿ãŸããã
Redbeatã«ã¯ãRedisããµããŒãããå ±æã¹ã±ãžã¥ãŒã«ç¶æ ãšã1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã«ããŠããããšã確èªããããã®ããã¯ã®äž¡æ¹ãå«ãŸããŠããããã䜿çšãéå§ããåŸã¯ã·ã³ã°ã«ããŒããBeatCopã¯å¿ èŠãããŸããã§ããã
ç§ãã¡ã®å®è£
ã§ã¯ãã»ããªããŒãã¯ãã¹ã±ãžã¥ãŒã©ãŒãšããŠRedbeatã䜿çšããŠããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§ã¹ãŒããŒãã€ã¶ãŒã«ãã£ãŠéå§ãããŸãïŒäŸïŒ exec celery beat --scheduler=redbeat.RedBeatScheduler --app=myproject.celery:app
ïŒã æ®å¿µãªãããä»äºé¢é£ã®ã³ãŒããå
±æããããšã¯ã§ããŸããããå®è£
å
šè¬ã«é¢ããè¿œå ã®è³ªåã«ã¯åãã§ãçãããŸãã
@mikeschaekermannã»ããªã®ããŒãã/ use / bin / flockã§ã©ããããŠã¢ã¯ã»ã¹ãããã¯ããŠã¿ãŠãã ãã...
flock /nfs/lock.file celery beat ...
NFSããã¯ã®å®è£ ãä¿¡é ŒããŠãããšä»®å®ããŸã:)
ããã«ããã1ã€ã ããå®éã«å®è¡ãããä»ã®1ã€ã¯ããã«ãŒãæ»ã¬ãŸã§ãããã¯ãããŸãã
@mikeschaekermannã»ããªã®ããŒãã/ use / bin / flockã§ã©ããããŠã¢ã¯ã»ã¹ãããã¯ããŠã¿ãŠãã ãã...
矀ã/nfs/lock.fileã»ããªããŒã..ã
NFSããã¯ã®å®è£ ãä¿¡é ŒããŠãããšä»®å®ããŸã:)
ããã«ããã1ã€ã ããå®éã«å®è¡ãããä»ã®1ã€ã¯ããã«ãŒãæ»ã¬ãŸã§ãããã¯ãããŸãã
ç§ã¯ãã®æ¹æ³ãè©ŠããŸããã æ®å¿µãªãããNFSããã¯ãä¿æããŠããã¯ã©ã€ã¢ã³ããNFSãµãŒããŒãžã®æ¥ç¶ã倱ã£ãå Žåãããã¯ã¯NFSãµãŒããŒã«ãã£ãŠåãæ¶ãããå¥ã®ã¯ã©ã€ã¢ã³ãã«æž¡ãããå¯èœæ§ããããŸãã å ã®ããã¯ãã«ããŒãæ¥ç¶ãå埩ãããšã矀ãã¯ããã¯ãåãæ¶ãããããšãèªèããªãããã2ã€ã®ããŒããããªãŒããŒãã§ãããšä¿¡ããŠããŸãã
ç§ã¯Postgresã§ã¢ããã€ã¶ãªããã¯ã䜿çšããããšã«ãªããŸããã django_pglocksã¢ãžã¥ãŒã«ã䜿çšãããµãããã»ã¹ã§ã»ããªããŒããå®è¡ããDjango管çã³ãã³ããäœæããŸããã
ç§ã¯Postgresã§ã¢ããã€ã¶ãªããã¯ã䜿çšããããšã«ãªããŸããã django_pglocksã¢ãžã¥ãŒã«ã䜿çšãããµãããã»ã¹ã§ã»ããªããŒããå®è¡ããDjango管çã³ãã³ããäœæããŸããã
ããã¯ç§ãNFSã䜿çšããŠèŠãã®ãšåãåé¡ã®åœ±é¿ãåããããå¯èœæ§ã®ããã«ãããããã§ãã ããã¯ãä¿æããŠããã¯ã©ã€ã¢ã³ããPostgresãµãŒããŒãšã®æ¥ç¶ã倱ã£ãå ŽåããŸãã¯PostgresãµãŒããŒãåèµ·åãããå Žåã¯ã©ããªããŸããïŒ
@ swt2cããããã¡ããããªãã¯æ£ããã§ãïŒ ããçš®ã®çãç¶ããå¿ èŠããããŸãã
ä»ç§ã¯ãã£ãŠããŸãïŒ
def _pre_exec():
prctl.set_pdeathsig(signal.SIGTERM)
with advisory_lock(LOCK_ID) as acquired:
assert acquired
logging.info("Lock acquired: %s", acquired)
p = subprocess.Popen(
celery,
shell=False,
close_fds=True,
preexec_fn=_pre_exec,
)
sys.exit(p.wait())
advisor_lock
ã¯ååž°ããµããŒãããŠããŸãããå®éã«ããŒã¿ããŒã¹ããã§ãã¯ããŠãããã©ããã¯ããããŸããã
In [8]: with advisory_lock('foo') as acquired:
...: print acquired
...: while True:
...: with advisory_lock('foo') as acquired:
...: print acquired
...: time.sleep(1)
...:
# Yes, it does:
True
True
True
<shutdown the instsance>
InterfaceError: cursor already closed
ã ãã...ç§ã¯ãããå€æŽããŠãããã¯/ããŒãªã³ã°ããµãååŸãç¶ãã倱æããå Žåã¯ããŒãã殺ãããšãã§ããŸãã çžäºæé€ãä¿èšŒãããã®ã§ã¯ãããŸããããç§ã®ç®çã«ã¯ååãããããŸããã
ç§ã®å ŽåãåæããŒãã¯ç¡é§ãªç ©ãããã§ãããæŽåæ§ã®åé¡ã§ã¯ãããŸããã ãããããªããç§ã¯ãŸããdbãããŠã³ããå Žåãã¿ã¹ã¯ããšã«ãã倱æããã¢ããã€ã¶ãªãŒããã¯ã§ã¿ã¹ã¯ãã©ããããããšãã§ããŸãã
ã¹ã±ãžã¥ãŒã«ãDBã«ããŒãã¹ãã¢ããããšããããŸãããDBãããŠã³ãããšãã«ããŒããã©ã®ããã«æ©èœãããã¯ãã¹ãããŠããŸããã
@ddevlinãããç§ãå®è£ ããããšèããŠãã解決çã ã£ãã®ã§ãããªãã®ã³ã¡ã³ããèŠãŠããããã£ãã§ãã
ãã ãã redbeat-2
ãããŠã³ãããšãã«ã¹ãŒããŒãã€ã¶ãŒãredbeat-1
èªååèµ·åããæ¹æ³ã®ããžãã¯ãå
±æã§ããã°ãããã¯å€§ããªå©ãã«ãªããŸãã
ããã¯ã supervisor
ã«é¢ããç解ãäžè¶³ããŠããããšãåå ã§ããå¯èœæ§ããããŸããã autorestart=True
ã¯ãå°ãªããšã1åã¯RUNNING
ç¶æ
ã«ãªãããã°ã©ã ã«å¯ŸããŠã®ã¿æå¹ã§ããããã§ãã
ç§ã®åé¡ã¯ïŒ
celery beat
ãšredbeat.RedBeatScheduler
supervisor.confã«2ã€ã®program
ããããŸããbeat
ïŒ beat-1
ïŒãããã¯ãååŸããŠå®è¡ãããããäžæ¹ïŒ beat-2
ïŒãæ°åéå§ãè©Šã¿ãŠFATAL
ç¶æ
ïŒ Seems we're already running?
ãšã©ãŒããïŒãbeat-1
ãåæ¢ããå Žåãã¹ãŒããŒãã€ã¶ãŒã«beat-2
ãéå§ããŠããããŸããRUNNING
ç¶æ
ã§ã¯ãªãã£ããããããã¯çºçããŸããã ã€ãŸãã beat-1
åæ¢ãããšãåæ¢ããŠäœãèµ·ãããŸãããç§ã®é ããé¢ããŠã解決çã¯ã5ç§ããšã«supervisorctl restart all
ãå®è¡ãç¶ããcron
ãæã€ããšã§ãããã©ã®ããã«éæã§ãããã«ã€ããŠããªãã®èããç¥ãããã ãã§ãã¹ãŒããŒãã€ã¶ãŒãšã®åé·æ§ã
ããã«ã¡ã¯@harisibrahimkv ãããªãã®åé¡ã¯ãåããã¹ãã§ã»ããªããŒãã®2ã€ã®åäžã®ã€ã³ã¹ã¿ã³ã¹ãéå§ããŠããããšã§ãã beat-2
ãã°ã«ERROR: Pidfile (celerybeat.pid) already exists.
ããŠãããšæããŸããïŒ åããã¹ãã§ã»ããªããŒãã®2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ãããšããããã®éã®ãã§ã€ã«ãªãŒããŒããã¹ãããã®ã«åœ¹ç«ã¡ãŸãããå®éã®åé·æ§ãåŸãã«ã¯ãè€æ°ã®ãã¹ãã§ã»ããªããŒããå®è¡ããå¿
èŠããããŸãã
åããã¹ãã§è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ããã«ã¯ãã¹ãŒããŒãã€ã¶ãŒã«--pidfile
åŒæ°ã§ã€ã³ã¹ã¿ã³ã¹ãéå§ãããåå¥ã®pidfileãæå®ããŸãã
# beat-1
celery beat --scheduler=redbeat.RedBeatScheduler --pidfile="beat-1.pid" ...
# beat-2
celery beat --scheduler=redbeat.RedBeatScheduler --pidfile="beat-2.pid" ...
äž¡æ¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ã¹ãŒããŒãã€ã¶ãŒã®äžã§æ£åžžã«èµ·åããã¯ãã§ããããã°ãã¡ã€ã«ã確èªããå Žåã¯ããã®ãã¡ã®1ã€ã ããã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã«ããŠããã¯ãã§ãã ãã®ã€ã³ã¹ã¿ã³ã¹ãåæ¢ãããšãä»ã®ã€ã³ã¹ã¿ã³ã¹ãã¿ã¹ã¯ã®ã¹ã±ãžã¥ãŒãªã³ã°ãåŒãç¶ãã®ãããããŸãã
ç§ãã¡ã®ç®æšã¯ãã»ããªã¯ãŒã«ãŒãå®è¡ããŠããåäžã®ãã¹ãã®èªåã¹ã±ãŒãªã³ã°ããŒã«ãšãã¹ãŒããŒãã€ã¶ãŒã®äžã§ã®ã»ããªããŒããäœæããããšã§ããã åãã¹ãã«ã¯ãåäžã®ã»ããªããŒãã€ã³ã¹ã¿ã³ã¹ããããŸãã ãã®æ§æã§ã¯ãã»ããªããŒãã¯ãã¹ãŠã®ãã¹ãã§æ£åžžã«éå§ãããŸãããããã¯ãååŸããªãã»ããªããŒãã®ã€ã³ã¹ã¿ã³ã¹ã¯äºå®äžãããã¹ã¿ã³ãã€ã«ãªããã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã«ããŸããïŒãã ããããŒã«å ã®ãã¹ãŠã®ãã¹ããã¿ã¹ã¯ãåŠçããŸãïŒã ããã¯ã®ããã€ã³ã¹ã¿ã³ã¹ãåæ¢ããå ŽåïŒããšãã°ãããŒã«ãçž®å°ãããå ŽåããŸãã¯ããŒã«å ã®ãã¹ãã®ããŒãªã³ã°ã¢ããã°ã¬ãŒããå®è¡ããŠããå ŽåïŒãã¹ã¿ã³ãã€ã€ã³ã¹ã¿ã³ã¹ã®1ã€ãããã¯ãååŸããã¹ã±ãžã¥ãŒãªã³ã°ã¿ã¹ã¯ãåŒãç¶ããŸãã
@ddevlinç§ã«æ»ã£ãŠããŠãã€ã³ã¿ãŒãããããã®ãããªçŽ æŽãããå Žæã«ããŠãããŠããããšãïŒ å¿ããæè¬ããŸãïŒ ïŒç§ã®å®¶æå šå¡ã«ããªãã®è¿äºã«ã€ããŠè©±ããŠããŸããïŒDïŒ
pidfile
ãããã¯æ©èœããããäžæ¹ãåæ¢ãããšãã«beat-2
ãã¿ã¹ã¯ãåŒãåããã®ãèŠãŠãšãŠãããããã£ãã§ãã CELERYBEAT_MAX_LOOP_INTERVAL = 25
ïŒã»ããª3.xïŒã§ããŒãã®æéãèšå®ã§ããŸãã
ã¯ããå®éã®åé·æ§ã®ããã«ããã®èšå®ãããŸããŸãªã€ã³ã¹ã¿ã³ã¹ã«ãŸãšããŠè¡ãäºå®ã§ãã 䜿çšããŠããã»ããã¢ããã«ã€ããŠèª¬æããŠããã ãããããšãããããŸãã ä»ããã«åãçµãã€ããã§ãã ãåãã€ã³ã¹ã¿ã³ã¹äžã®è€æ°ã®ãã¹ããã®ã»ããã¢ããã¯ãæ£ããç解ãããŠããããã«ããã§ã€ã«ãªãŒããŒã®æŠå¿µããã®ã¹ãŒããŒãã€ã¶ãŒã®ã»ããã¢ããã§æ©èœãããã©ãããæåã«æ€èšŒããããšã§ããã
æž©ããæè¬ã
ã€ã³ãäºå€§éžã®æå端ã«ããå°ããªæããã :)
æãåèã«ãªãã³ã¡ã³ã
@ ankur11ã·ã³ã°ã«ããŒãã¯ãã»ããªããŒãã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãå®è¡ãããŠããããšãä¿èšŒããŸãããã€ã³ã¹ã¿ã³ã¹éã§ã¹ã±ãžã¥ãŒã«ç¶æ ãåæããŸããã
15åããšã«å®è¡ããããšãç®çãšããå®æçãªã¿ã¹ã¯ã§ããã©ã«ãã®ã¹ã±ãžã¥ãŒã©ãŒã䜿çšããã¿ã¹ã¯ãæåŸã«å®è¡ãããŠãã14ååŸã«ã·ã³ã°ã«ããŒãã§ãã§ã€ã«ãªãŒããŒããå Žåãã¿ã¹ã¯ã¯æ°ããã»ããªããŒãã®15ååŸãŸã§å®è¡ãããŸããã§ãããã€ã³ã¹ã¿ã³ã¹ãéå§ããã29åã®ã®ã£ãããçºçããŸããã
ã€ã³ã¹ã¿ã³ã¹éã§ã¹ã±ãžã¥ãŒã«ç¶æ ãå ±æããã«ã¯ãå¥ã®ã¹ã±ãžã¥ãŒã©ãŒã䜿çšããå¿ èŠããããŸããã django-celery-beatã¯Celeryã®ããã¥ã¡ã³ãã«èšèŒãããŠãã代æ¿æ段ã§ããããã§ã«RedisãCeleryããã¯ãšã³ããšããŠäœ¿çšããŠãããããã¹ã±ãžã¥ãŒã«åæã®ããã¯ãšã³ããšããŠRedisã䜿çšããããšã奜ã¿ãŸããã
Redbeatã«ã¯ãRedisããµããŒãããå ±æã¹ã±ãžã¥ãŒã«ç¶æ ãšã1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã«ããŠããããšã確èªããããã®ããã¯ã®äž¡æ¹ãå«ãŸããŠããããã䜿çšãéå§ããåŸã¯ã·ã³ã°ã«ããŒããBeatCopã¯å¿ èŠãããŸããã§ããã
ç§ãã¡ã®å®è£ ã§ã¯ãã»ããªããŒãã¯ãã¹ã±ãžã¥ãŒã©ãŒãšããŠRedbeatã䜿çšããŠããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§ã¹ãŒããŒãã€ã¶ãŒã«ãã£ãŠéå§ãããŸãïŒäŸïŒ
exec celery beat --scheduler=redbeat.RedBeatScheduler --app=myproject.celery:app
ïŒã æ®å¿µãªãããä»äºé¢é£ã®ã³ãŒããå ±æããããšã¯ã§ããŸããããå®è£ å šè¬ã«é¢ããè¿œå ã®è³ªåã«ã¯åãã§ãçãããŸãã