2010-01-27 11 views
5

È possibile integrare asyncore con dbus tramite lo stesso main loop?Python asyncore & dbus

Di solito, l'integrazione DBus viene fatto attraverso glib ciclo principale: è possibile avere sia asyncore integrare questo ciclo principale o usufruire dbus asyncore 's?

+0

Perché dovresti usare asyncore quando hai glib? glib sembra molto più capace ... –

risposta

7

asyncore fa schifo. glib fornisce già materiale asincrono, quindi usa il mainloop di glib per fare tutto.

0

Anche se si ottiene quella che è probabilmente una risposta perfettamente ragionevole, esiste un altro approccio: non è necessario utilizzare il ciclo di asyncore di per sé. Basta chiamare asyncore.loop con un timeout pari a zero e un conteggio pari a 1, che interrompe l'iterazione (e quindi rende il nome della funzione completamente fuorviante) e esegue il polling dei socket una sola volta. Chiamalo tutte le volte che ti servono.

Non so nulla del supporto asincrono di glib, ma se richiede threadpotete comunque ottenere prestazioni migliori usando asyncore in questo modo poiché utilizzerà select o poll e non avrà bisogno di generare thread aggiuntivi.

+1

grazie per i tuoi pensieri - Ho scelto Twisted per questo progetto. – jldupont

1

ho scritto un banale GSource wrapper per uno dei my own projects chiamato AsyncoreGSource

Basta attach ad un appropriato MainContext:

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

Naturalmente i valori di default sono asyncore.socket_map e il default MainContext rispettivamente.

Puoi anche provare monkey-patching asyncore.socket_map, che sarebbe stata la mia soluzione se non avessi spiato il GLib python bindings source code for GSource.

+0

Nota che da allora ho riscontrato alcuni problemi di prestazioni e ho una versione completamente integra all'interfaccia di polling di GLib su Linux (ma non su Windows). Aggiornerò questa risposta quando le cose si stabilizzeranno. –

Problemi correlati