我正在使用带有django和django-celery-beat/django-celery-results的Celery
。芹菜工作正常,直到它到达这段代码:figure, ax = plt.subplots(figsize=(15,3))
然后它退出引用signal 11
:
[2018-09-04 19:43:21,928: ERROR/MainProcess] Process 'ForkPoolWorker-1' pid:42611 exited with 'signal 11 (SIGSEGV)'
[2018-09-04 19:43:21,962: ERROR/MainProcess] Task handler raised error: WorkerLostError('Worker exited prematurely: signal 11 (SIGSEGV).',)
Traceback (most recent call last):
File "/Users/user/.local/share/virtualenvs/venv/lib/python3.6/site-packages/billiard/pool.py", line 1223, in mark_as_worker_lost
human_status(exitcode)),
billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).
知道可能会发生什么吗?
芹菜设置:
CACHE_LOCATION = "redis://%s:6379" % REDIS_HOST
CELERY_BROKER_URL = CACHE_LOCATION
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
版本:
台球==3.5.0.4 芹菜==4.1.0
我知道这个问题有点旧,但我遇到了同样的问题并找到了一个简单的解决方案。但是,这可能取决于您要在celery
内部使用matplotlib
做什么。
如果像我一样,您有一个长时间运行的芹菜作业,该作业正在计算要在静态图像文件中绘制的一些值,那么我的答案应该有效。
基本上问题来自matplotlib的后端。正如您在文档 https://matplotlib.org/faq/usage_faq.html#what-is-a-backend 中看到的那样,您可以选择将呈现图形的后端。而且您有交互式和非交互式后端。如果像我一样,您只想绘制图形并将它们保存在静态文件中,则不需要默认的交互式后端。
由于某种未知原因,默认后端不适用于芹菜并引发SIGSEGV,因此对我有用的是在导入时指定另一个后端:
import matplotlib
matplotlib.use("Agg")
希望这有帮助。