Django 서비스에서 정해진 시간마다 반복하는 작업이 있을 때 Celery 를 활용합니다. Celery 에 포함된 Task 중 에서 multiprocessing 을 포함하는 경우, 다음과 같은 오류를 출력하였습니다.


오류내용

Exception	AssertionError('daemonic processes are not allowed to have children')
Timestamp	2024-01-01 12:00:00.019620 KST
  File "/usr/lib/python3.11/multiprocessing/pool.py", line 329, in _repopulate_pool_static
    w.start()
  File "/usr/lib/python3.11/multiprocessing/process.py", line 118, in start
    assert not _current_process._config.get('daemon'), \
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: daemonic processes are not allowed to have children


원인분석

AssertionError: daemonic processes are not allowed to have children 오류는 assert not _current_process._config.get(’daemon’) 조건을 만족시키지 못해서 발생 하는 것입니다. 즉 Celery 의 Task 데몬 프로세스에서 자식 프로세스를 만들 수 없는데 현재 실행중인 Task 의 process 가 데몬 프로세스이므로 새로운 프로세스를 만드는 작업을 할 수 없어서 발생한 오류 입니다. 출처 - AssertionError: daemonic processes are not allowed to have children 의 해결


해결방법

Celery Issue - daemonic processes are not allowed to have children #4525 에 나온것 처럼 Celery Worker 실행할 때 옵션을 추가하면 해결 되었습니다.

$ celery -A mysite worker -P threads
....

worker: Warm shotdown (MainProcess)


참고사이트