Using asyncio in event-driven network library
tjreedy at udel.edu
Mon Dec 23 20:59:22 CET 2013
On 12/23/2013 11:47 AM, Chris Angelico wrote:
> On Mon, Dec 23, 2013 at 10:50 PM, Tobias M. <tm at tobix.eu> wrote:
>> I am currently writing an event-driven client library for a network protocol
>>  and chose to use the new asyncio module. I have no experience with
>> asynchronous IO and don't understand all the concepts in asyncio yet. So I'm
>> not sure if asyncio is actually the right choice .
> As was acknowledged on -tutor, asyncio is extremely new. I don't know
> if anyone's yet used it for GUI handling, or even if the module was
> intended for that.
Asyncio is aimed, as the name says, at non-blocking io, but allows
non-blocking on other tasks. It replaces asyncore, now deprecated (but
not removed). Developers of Twisted, Tornado, and other async frameworks
had input. It was partly inspired, I think, by C#'s await, which allows
async code to look much like normal blocking code (Guido does not like
writing callbacks ;-). The default event loop is intended to be
replaceable by other event loops that expose the same interface.
I know that Twisted can work with GUI loops but I do not know the
details. I suspect that the same methods can and will be make to work
with the asyncio loop, or that the Twisted loop will get an adaptor so
it can replace the asyncio default loop.
What would be easiest for user-developers would be if someone were able
to wrap a gui loop in a way to give it the needed interface, so the gui
loop itself replaced and became the asyncio loop.
> You may be able to wrap your GUI code up so it fits inside asyncio.
> Rather than run a simple event loop, you could have your own loop that
> does some kind of checking: PyGTK has functions for peeking at events
> and doing just one iteration of the main loop, so you could pump all
> events with something like this:
> while gtk.events_pending(): gtk.main_iteration()
> No doubt other toolkits have something similar.
I think tk(inter) has 'run pending events' or something.
> Alternatively, you could run two threads: one for your GUI, and
> another one for your asyncio. How easy and clean that would be is hard
> to say without trying it; it could work out beautifully for your code,
> or it could be horribly clunky.
> This might be your big contribution to Python for the year: a nice,
> easy, working example of using asyncio with a GUI toolkit!
Such would definitely be welcome.
Terry Jan Reedy
More information about the Python-list