Как создать glib.Source из Python? - PullRequest
2 голосов
/ 14 января 2011

Я хочу интегрировать некоторые asyncore.dispatcher экземпляры в основной контекст GLib по умолчанию .

Я полагаю, что могу создать пользовательский GSource, который сможет определять готовность к событию на различных сокетах в asyncore.socket_map. Из C я полагаю, что это достигается созданием необходимых GSourceFuncs, которые могут включать дешевые и неблокирующие вызовы для выбора, а затем обрабатывать их с помощью asyncore.read, .write и friends.

Как мне на самом деле создать GSource из Python? Класс glib.Source недокументирован , и попытки использовать класс в интерактивном режиме были тщетными.

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

Ответы [ 2 ]

0 голосов
/ 15 февраля 2011

Ниже показан простой способ интеграции диспетчера с циклом 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)
0 голосов
/ 14 января 2011

glib.io_add_watch делает это (добавьте наблюдение за fd в основной цикл):

http://library.gnome.org/devel/pygobject/2.26/glib-functions.html#function-glib--io-add-watch

...