Как создать glib.Source из Python?
Я хочу интегрировать некоторые asyncore.dispatcher
экземпляры в главном контексте GLib по умолчанию.
Я полагаю, я могу создать кастом GSource
который в состоянии обнаружить готовность события на различных сокетах в asyncore.socket_map
, Из C I считают, что это делается путем создания необходимых GSourceFuncs
который может включать дешевые и неблокирующие вызовы для выбора, а затем обрабатывать их, используя asyncore.read,.write и friends.
Как мне на самом деле создать GSource из Python? Класс glib.Source недокументирован, и попытки использовать класс в интерактивном режиме были тщетными.
Есть ли какой-то другой метод, который позволяет мне обрабатывать события сокета в asyncore
модуль, не прибегая к тайм-аутам (или что-нибудь, что ставит под угрозу потенциальную пропускную способность и использование процессора)?
2 ответа
Это делает glib.io_add_watch (добавьте наблюдение за fd в основной цикл):
http://library.gnome.org/devel/pygobject/2.26/glib-functions.html
Простой способ интеграции диспетчера с циклом glib показан очень упрощенно ниже:
from asyncore import dispatcher, loop
from glib import MainLoop, idle_add
def loop_one():
loop(timeout=0, count=1)
return True
idle_add(loop_one)