Простой, не сетевой пример Twisted / PyGTK - PullRequest
4 голосов
/ 06 июля 2010

Я изо всех сил пытался заставить некоторую асинхронную активность работать под PyGTK, когда кто-то предложил мне взглянуть на использование Twisted.

Я знаю, что Twisted запускался как сетевая среда, но его можно использовать для другихвещи.Тем не менее, каждый пример, который я когда-либо видел, включает в себя много сетевого кода.Я хотел бы увидеть пример использования Twisted для простого настольного PyGTK-приложения, без необходимости затрачивать дополнительные умственные усилия для понимания сетевого аспекта вещей.

Итак: есть ли чистый, простой учебник дляили пример использования Twisted для создания приложения GTK (PyGTK) и выполнения асинхронных задач?

(Да, я видел pbgtk2.py . Это не комментировано, ориентировано на сеть и полностью сбивает с толкуновичку.)

Обновлено: Я перечислил различные сообщения с glib.idle_add / gtk.gdk.lock и друзьями, которые не работают должным образом под Windows.Все это было рассмотрено в списке pygtk - с PyGTK требуется некоторая хитрость, чтобы асинхронное поведение работало под Windows.

Однако моя точка зрения остается неизменной, что всякий раз, когда я упоминаю о выполненииасинхронная активность в PyGTK, кто-то говорит "не используйте потоки, используйте Twisted!"Я хочу знать, почему и как.

1 Ответ

2 голосов
/ 08 июля 2010

Twisted для выполнения асинхронных задач в pygtk просто использует функции , такие как gobject.io_add_watch / glib.io_add_watch и gobject.timeout_add / glib.timeout_add (плюс некоторые другие, вы найдете их в gobject и модуль glib ), поэтому нет большой разницы в использовании сырых функций pygtk или скрученных, если вам не нужна сеть.

Поскольку сложение twisted имеет те же проблемы, что и pygtk с асинхронными задачами, twisted использует тот же цикл, что и pygtk, и поэтому он блокируется, если вы выполняете какую-либо задачу блокировки!

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

Я протестировал в приложении правильное поведение под окнами twisted + pygtk, но я избегал блокировать вещи (максимальное чтение из большого файла, кусок на кусок в основном используя glib.idle_add или glib.io_add_watch, в смысле этот витой использует что-то вроде этого).

Например, я не уверен, что процесс порождения и обработки stdout с glib.io_add_watch, похоже, не работают. Я написал статью в своем блоге , в которой описывается выполнение асинхронных процессов в pygtk, но я не очень уверен, что это работает в Windows, хотя это может зависеть от версии.

...