Как создать 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)
Другие вопросы по тегам