Matplotlib subplot()期间,芹菜工人过早退出

时间:2018-09-04 10:52:23

标签: python django matplotlib celery

我正在将Celery与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 celery == 4.1.0

1 个答案:

答案 0 :(得分:0)

我知道这个问题有点老了,但是我遇到了同样的问题,并且找到了一个简单的解决方案。但是,这可能取决于您要对matplotlib中的celery进行处理。

如果像我一样,您有一份长期的芹菜工作,正在计算要在静态图像文件中绘制的某些值,那么我的答案应该有用。

基本上,问题出在matplotlib的后端。如您在文档https://matplotlib.org/faq/usage_faq.html#what-is-a-backend中所见,您可以选择将呈现图形的后端。您有 interactive non-interactive 后端。如果像我一样,您只想绘制图形并将其保存在静态文件中,则不需要默认的 interactive 后端。

由于某些未知原因,默认后端在芹菜上不起作用,并引发了 SIGSEGV ,因此,对我有用的是在导入时指定另一个后端:

import matplotlib
matplotlib.use("Agg")

希望这会有所帮助。