Python: построить некоторые данные (matplotlib) без GIL

моя проблема, конечно, в GIL. Пока я анализирую данные, было бы неплохо представить некоторые графики между ними (чтобы не было слишком скучно ждать результатов).

Но GIL предотвращает это (и это приводит меня к тому, что я задаюсь вопросом, был ли Python такой хорошей идеей с самого начала).

Я могу только отображать график, ждать, пока пользователь его закроет, и после этого начинать расчеты. Пустая трата времени очевидно.

Я уже пробовал модули подпроцесса и многопроцессорности, но не могу заставить их работать.

Есть мысли по этому поводу? Спасибо

Редактировать: Хорошо, это не GIL, а show().


person BandGap    schedule 30.04.2010    source источник


Ответы (4)


Это не проблема matplotlib или GIL.

В matplotlib вы можете открыть столько рисунков, сколько хотите, и отображать их на экране, в то время как ваше приложение продолжает заниматься другими делами.

Вы должны использовать matplotlib в интерактивном режиме. Это, вероятно, ваша проблема.

from matplotlib import interactive
interactive(True)

это должно быть в верхней части вашего импорта

person joaquin    schedule 30.04.2010

Это не имеет ничего общего с GIL, просто измените свой код анализа, чтобы он время от времени обновлял график (например, каждые N итераций).

Только тогда, если вы видите, что отрисовка графика слишком сильно замедляет код анализа, поместите код обновления графика в подпроцесс с многопроцессорностью.

person Luper Rouch    schedule 30.04.2010
comment
Я не думаю, что вы поняли, что я имею в виду. Когда отображается график, интерпретатор останавливается, пока окно не будет закрыто. Поместите оператор печати до и после show(), и вы увидите... Или, если я ошибаюсь, не могли бы вы включить какой-нибудь псевдокод, чтобы проиллюстрировать правильное использование команд построения графика (в частности, куда поместить метод show() вызов? - person BandGap; 30.04.2010
comment
show(), как говорится в документе, должен использоваться только один раз в вашем сценарии. Вам нужно будет использовать другой метод для того, что вы хотите сделать. Например, вы можете визуализировать свой график в изображение и отображать его с помощью внешней программы, такой как eog, или если вы используете визуализацию графического интерфейса для растрового изображения и т. д. - person Luper Rouch; 30.04.2010

Я думаю, вам нужно поместить график в правильную оконную систему, а не полагаться на встроенный код шоу.

Может быть, будет достаточно вставить .show() в другой поток?

GIL не имеет значения - у вас есть блокирующий вызов show(), поэтому вам нужно сначала обработать его.

person Douglas Leeder    schedule 30.04.2010

Кажется, что метод draw() может обойти необходимость show().

Единственная причина, оставшаяся для .show() в скрипте, состоит в том, чтобы позволить ему выполнять блокирующую часть, чтобы изображения не исчезали, когда скрипт достигает своего конца.

person BandGap    schedule 30.04.2010