Matplotlib - Tcl_AsyncDelete: асинхронный обработчик удален не тем потоком?

Я задаю этот вопрос, потому что я не могу решить одну проблему в Python/Django (на самом деле в чистом Python это нормально), что приводит к RuntimeError: tcl_asyncdelete async handler deleted by the wrong thread. Это как-то связано с тем, как я matplotlib сюжеты matplotlib в Django. Я делаю это так:

...
import matplotlib.pyplot as plt
...
fig = plt.figure()
...
plt.close()

Я чрезвычайно минимизировал мой код. Но подвох - даже если у меня есть только одна строка кода:

fig = plt.figure()

Я вижу, что происходит RuntimeError. Я надеюсь, что смогу решить проблему, если бы я знал правильный способ закрытия/очистки/уничтожения графиков в Python/Django.

Ответ 1

По умолчанию matplotlib использует инструментарий TK gui, когда вы создаете изображение без использования инструментария (т.е. в файл или строку), matplotlib все еще создает окно, которое не отображается, вызывая всевозможные проблемы. Чтобы этого избежать, вы должны использовать бэкэнд Agg. Его можно активировать так:

import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot

Для получения дополнительной информации обратитесь к документации matplotlib - http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server