2010-01-27 12 views
5

Czy można zintegrować asyncore z dbus przez to samo main loop?Python asyncore & dbus

Zazwyczaj integracja DBus odbywa się poprzez glib pętli głównej: czy jest to możliwe, aby mieć albo asyncore zintegrować tę główną pętlę lub mogą korzystać dbus asyncore „s?

+0

Po co używać asyncore, gdy masz glib? glib wydaje się znacznie bardziej zdolny ... –

Odpowiedz

7

asyncore ssie. glib zapewnia już asynchronizację, więc po prostu używaj puli głównej glib, aby zrobić wszystko.

0

Mimo że otrzymałeś prawdopodobnie całkiem sensowną odpowiedź, istnieje inne podejście - nie musisz używać pętli asyncore jako takiej. Po prostu wywołaj asyncore.loop z zerowym czasem oczekiwania i liczbą 1, która zatrzyma iterację (i tym samym sprawi, że nazwa funkcji będzie całkowicie myląca) i odpytuje gniazda tylko raz. Dzwoń tak często, jak potrzebujesz.

Nie wiem nic na temat asynchronicznego wsparcia glib, ale jeśli wymaga on wątków, możesz uzyskać lepszą wydajność, używając asyncore w ten sposób, ponieważ będzie używał select lub poll i nie będzie musiał spawnować dodatkowych wątków.

+1

dzięki za twoje myśli - zdecydowałem się na Twisted dla tego projektu. – jldupont

1

napisałem banalne GSource opakowanie dla jednego z my own projects zwanego AsyncoreGSource

Wystarczy attach go do odpowiedniego MainContext:

source = AsyncoreGSource([socket_map]) 
source.attach([main_context]) 

Naturalnie domyślnie są asyncore.socket_map a default MainContext odpowiednio.

Możesz także wypróbować monkey-patching asyncore.socket_map, które byłoby moim rozwiązaniem, gdyby nie przeszukano przez GLib python bindings source code for GSource.

+0

Zauważ, że od tego czasu mam kilka problemów z wydajnością i mam wersję, która w pełni integruje się z interfejsem GLib w systemie Linux (ale nie Windows). Zaktualizuję tę odpowiedź, gdy wszystko się ustabilizuje. –