Реализация многопоточной модели выполнения

realizaciya mnogopotochnoj modeli vypolneniya Почтовый клиент PyMailGUI Python

Практически на любой платформе продолжительные операции, такие как получение или отправка почты, выполняются в параллельных потоках, благодаря чему графический интерфейс остается активным — он продолжает обновляться и откликаться на действия пользователя, пока производится передача в фоновом режиме. Это относится к большинству графических интерфейсов с поддержкой многопоточной модели выполнения; тем не менее, ниже приводятся два замечания, касающиеся особенностей ее реализации в PyMailGUI:

Обнов ле ние гра фи че ско го ин тер фей са: очередь обра бот чи ков обрат но- го вы зо ва

Как мы узнали ранее в этой книге, обычно только главный поток выполнения, создавший графический интерфейс, должен обновлять его. Подробнее об этом рассказывается в главе 9 — библиотека tkinter не поддерживает возможность параллельного изменения графического интерфейса. Как результат, программа PyMailGUI не выполняет никаких действий, имеющих отношение к пользовательскому интерфейсу, внутри потоков, производящих загрузку, отправку или удаление электронных писем. Вместо этого главный поток графического интерфейса продолжает откликаться на события, порождаемые пользователем, и обновляться и использует таймер для просмотра очереди обработчиков обратного вызова, добавляемых рабочими потоками выполнения, применяя для этого инструменты, реализованные нами в главе 10 (пример 10.20). При обнаружении обработчика в очереди поток выполнения графического интерфейса извлекает и вызывает его, чтобы обеспечить возможность изменения графического интерфейса в контексте главного потока.

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

Для простоты PyMailGUI помещает в очередь свя зан ные ме то ды объектов, которые соединяют в себе вызываемую функцию и ссылку на объект графического интерфейса. Поскольку все потоки выполняются в одном и том же процессе и области памяти, ссылка на объект графического интерфейса, помещаемая в очередь, обеспечивает доступ к любой информации в графическом интерфейсе, которую требуется обновить, включая объекты виджетов. Кроме того, в качестве функций потоков PyMailGUI также использует связанные методы, что позволяет потокам обновлять информацию в целом, о чем рассказывается в следующем абзаце.

Изме не ние другой ин форма ции: бло киро ва ние опера ций, пере кры ваю- щих ся во вре ме ни

Несмотря на то, что только что описанная схема обновления графического интерфейса с применением очереди обработчиков обратного вызова эффективно ограничивает область изменения графического интерфейса единственным главным потоком, тем не менее, она не гарантирует полную безопасность в целом. Поскольку некоторые дочерние потоки обновляют объекты, используемые совместно с другими потоками (например, кэш электронной почты), для предотвращения перекрытия операций во времени PyMailGUI также использует блокировки, если эти операции могут конфликтовать друг с другом, обращаясь к одним и тем же данным. Сюда входят операции, изменяющие совместно используемые объекты в памяти (например, загрузка заголовков и содержимого в кэш), а также операции, которые могут изменять нумерацию загруженных сообщений (например, удаление).

Везде, где одновременное выполнение потоков может приводить к проблемам, графический интерфейс проверяет состояние блокировок и выводит сообщение, когда операция не может быть выполнена немедленно. Конкретные случаи, когда применяется это правило, описываются в исходном программном коде и в тексте справки.

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

Кроме того, некоторые операции по сохранению почты, которые порой могут выполняться продолжительное время, также выполняются в параллельных потоках, чтобы избежать блокирования графического интерфейса. А чтобы предотвратить возможность одновременного получения одних и тех же писем в параллельных потоках и выполнения лишней работы, в этой редакции используется объект множества (смотрите обзор изменений в версии 3.0 выше).

Подробнее о том, почему все это имеет большое значение, рассказывается в главах 5, 9 и 10, где обсуждаются потоки выполнения. На самом деле, программа PyMailGUI просто является конкретной реализацией концепций, исследованных нами ранее.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий