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