2010-01-27 3 views
5

Можно ли интегрировать asyncore с dbus через те же main loop?Python asyncore & dbus

Обычно интеграция DBus осуществляется через glib основного цикла: можно иметь либо asyncore интегрировать этот основной цикл или есть использование DBus asyncore «S?

+0

Зачем вам использовать asyncore, когда у вас есть glib? glib кажется гораздо более способным ... –

ответ

7

asyncore отстой. glib уже предоставляет асинхронные вещи, поэтому просто используйте mainloop glib, чтобы сделать все.

0

Хотя у вас есть то, что, вероятно, вполне разумный ответ, есть другой подход - вам не нужно использовать цикл асинхроров как таковой. Просто вызовите asyncore.loop с нулевым таймаутом и счетчиком 1, что останавливает его итерацию (и, таким образом, имя функции полностью вводит в заблуждение) и опроса сокетов только один раз. Назовите это так часто, как вам нужно.

Я не знаю ничего о поддержке асинхронной поддержки glib, но если она требует потоков, вы все равно можете получить лучшую производительность, используя asyncore таким образом, так как она будет использовать select или poll и не потребуется создавать дополнительные потоки.

+1

спасибо за ваши мысли - я решил на Twisted для этого проекта. – jldupont

1

Я написал тривиальную GSource обертки для одного из my own projects называется AsyncoreGSource

Просто attach его соответствующим MainContext:

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

Естественно, по умолчанию является asyncore.socket_map и default MainContext соответственно.

Вы также можете попробовать monkey-patching asyncore.socket_map, который был бы моим решением, если бы я не пробил через GLib python bindings source code for GSource.

+0

Обратите внимание, что с тех пор я столкнулся с несколькими проблемами с производительностью и имею версию, которая полностью интегрируется с интерфейсом опроса GLib в Linux (но не в Windows). Я обновлю этот ответ, когда ситуация стабилизируется. –