On 2012-10-29, at 10:07 PM, Guido van Rossum <guido@python.org> wrote: [...]
5. For epoll you probably want to check/(log?) EPOLLHUP and EPOLLERR errors too.
Do you have a code sample? I haven't found a need yet.
Just a code dump from my epoll proactor: if ev & EPOLLHUP: sock.close(_error_cls=ConnectionResetError) self._unschedule(fd) continue if ev & EPOLLERR: sock.close(_error_cls=ConnectionError, _error_msg='socket error in epoll proactor') self._unschedule(fd) continue [...]
It would be even better if we can return a tiny wrapper, that lets you to simply write 'doit.run().with_timeout(2.1)', instead of:
task = scheduling.Task(doit(), timeout=2.1) task.start() scheduling.run()
The run() call shouldn't be necessary unless you are at the toplevel.
Yes, that's just a sugar to make top-level runs more appealing. You'll also get a nice way of setting timeouts, yield from coro().with_timeout(1.0) [...]
I also liked the simplicity of the Task class. I think it'd be easy to mix greenlets in it by switching in a new greenlet on each 'step'. That will give you 'yield_()' function, which you can use in the same way you use 'yield' statement now (I'm not proposing to incorporate greenlets in the lib itself, but rather to provide an option to do so) Hence there should be a way to plug your own Task (sub-)class in.
Hm. Someone else will have to give that a try.
I'll be that someone once we choose the direction ;) IMO the greenlets integration is a very important topic. - Yury