# AttributeError async & KeyError async
kombu와 celery의 버전이 충돌하는 것이니, celery 버전을 4.2.1로 업데이트한다.
GitHub celery 이슈에 있더라.(KeyError async #870)
celery와 버전이 엮인 라이브러리는 billiard, kombu, amqp, vine이다.
Collecting celery==4.1.1
Downloading https://files.pythonhosted.org/packages/99/fa/4049b26bfe71992ecf979acd39b87e55b493608613054089d975418015b7/celery-4.1.1-py2.py3-none-any.whl (394kB)
100% |████████████████████████████████| 399kB 24.1MB/s
Requirement already satisfied: pytz>dev in /home/venv/platform_env/lib/python3.5/site-packages (from celery==4.1.1) (2016.10)
Requirement already satisfied: billiard<3.6.0,>=3.5.0.2 in /home/venv/platform_env/lib/python3.5/site-packages (from celery==4.1.1) (3.5.0.4)
Requirement already satisfied: kombu<5.0,>=4.2.0 in /home/venv/platform_env/lib/python3.5/site-packages (from celery==4.1.1) (4.2.1)
Requirement already satisfied: amqp<3.0,>=2.1.4 in /home/venv/platform_env/lib/python3.5/site-packages (from kombu<5.0,>=4.2.0->celery==4.1.1) (2.3.2)
Requirement already satisfied: vine>=1.1.3 in /home/venv/platform_env/lib/python3.5/site-packages (from amqp<3.0,>=2.1.4->kombu<5.0,>=4.2.0->celery==4.1.1) (1.1.4)
Installing collected packages: celery
Found existing installation: celery 4.0.0
Uninstalling celery-4.0.0:
Successfully uninstalled celery-4.0.0
Successfully installed celery-4.1.1
근데 celery 4.2.1에는 함정이 있었으니...
# [Errno 104] Connection reset by peer after started
celery를 실행하는 도중 이렇게 클라이언트와의 연결이 끊겨버려 celery task 자체는 돌아가나 리턴 값을 넘겨줄 수 없던 에러다.
이 에러가 환장이었던 건, 에러가 나오다 말다 해서 대체 어떤 상황에서 발생하는지 알 수가 없었다는 거다.
다행히도 celery GitHub 이슈가 있어서 참고했다.
해결 방법은 간단하다. celery 4.2 버전을 사용하지 말 것.
GitHub Issue: Avoid celery version 4.2. #296
GitHub Issue: Celery 4.2.0 workers lost connection with AMQP constantly! #4608
GitHub Issue: celery raise error: [Errno 104] Connection reset by peer after started #4867
+ 18.11.26 해결됨!!!
내가 여전히 에러가 난다고 하니, celery 프로젝트의 멤버 중 하나가 master branch의 dependency를 따랐냐고 댓글을 달아줬다.
$ pip install "celery[librabbitmq]"
$ pip install "celery[librabbitmq,redis,auth,msgpack]"
+ 18.11.28 다시 안 됨
이젠 뭐가 문젠지 감도 안 잡힌다. 파이썬 라이브러리 충돌은 아닌 것 같고 rabbitmq 문제인 듯 한데 이리저리 손 써봐도 안 돼서 그냥 정상 작동하는 다른 서버 이미지를 복붙했다...
지금은 celery 4.0 사용중
# kombu.exceptions.EncodeError
celery task의 argument로 model object를 보냈을 때 발생한 에러이다.
이유인즉슨, celery가 task를 실행할 때 브로커(RabbitMQ)에게 메시지를 보내는데 이때 이 메시지는 serialization을 거친다.
이는 곧 task의 arguments도 serialize 된다는 건데, 이게 JSON으로 파싱되지 못할 경우 문제가 생긴다.
model object의 경우에는 당연히 JSON serializable 하지 않아서 에러가 난 것.
또 task의 리턴 값에도 이 serialization이 적용되기 때문에 주의해야 한다.
스택오버플로우 참고:
kombu.exceptions.EncodeError: <Flask 'src'> is not JSON serializable
kombu.exceptions.EncodeError: User is not JSON serializable
# child process exiting after exceeding memory limit
이건 에러 로그에서 보이듯이 메모리 부족이 원인이다.
해결 방법은 celery 메모리 제한을 높여주는 것.
/etc/default/celeryd 파일에서 CELERYD_OPTS을 수정해주면 된다.
CELERYD_OPTS="--max-memory-per-child=150000"
그리고 django를 사용하고 있다면 아래처럼 settings.py에서 설정해줄 수도 있는데, 난 이게 먹히지 않아서 위의 방법을 썼다.
CELERY_WORKER_MAX_MEMORY_PER_CHILD = 150000
'개발 > python' 카테고리의 다른 글
[Python] generator와 yield (2) | 2019.02.18 |
---|---|
Python3.6에서는 dict가 입력순으로 정렬된다. (2) | 2019.02.15 |
not not not not not True (4) | 2019.02.12 |
[Python] Python으로 SMS 보내는 방법 (5) | 2019.02.08 |
<파이썬; 코딩의 기술> 파이썬다운 생각 (2) | 2019.02.07 |
댓글