2010-04-30 3 views
2

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

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

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

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

Любые мысли об этом? Спасибо

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

ответ

5

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

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

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

from matplotlib import interactive 
interactive(True) 

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

3

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

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

+0

Я не думаю, что вы поняли, что я имею в виду. Когда отображается график, интерпретатор останавливается, пока окно не будет закрыто. Поместите заявление печати до и после show(), и вы увидите ... Или, если я ошибаюсь, вы можете включить некоторый псевдо-тред, чтобы проиллюстрировать правильное использование команд построения (в частности, где поставить шоу () вызов метода? – BandGap

+1

[show()] (http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show), как говорит док, предполагается использовать только один раз в вашем скрипте. вам нужно будет использовать другой метод для того, что вы хотите сделать. Например, вы можете отобразить свой график на изображении и отобразить его с помощью внешней программы, например, eog, или если вы используете визуализацию графического интерфейса в pixmap и т. д. –

3

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

Возможно, хватит .show() в другом потоке?

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

2

Похоже, что метод рисования() может обойти необходимость показа().

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

+0

+1: Мне было интересно, когда кто-то упомянул об этом ... :) – EOL