Pim Klanke <p...@protonic.nl> added the comment:

On 26-09-17 14:13, STINNER Victor wrote:
> 
> STINNER Victor added the comment:
> 
> It would help to look how Twisted, eventlet, gevent and others handle "urgent 
> data" and "exceptions". 
First of all, there are no exceptions, only "exceptional conditions". 
Second of all, There is no "urgent data" AND "exceptional conditions"; 
"urgent data" is one of possible exceptional conditions, but not all 
exceptional conditions mean there is urgent data to read.

Check if they succeeded to formalize these events.
IMO, they have made it more confusing by using the word 'exception'. In 
this case I would have stuck with 'exceptional'. But at least it is 
better than having to replace it with 'urgent data'
> 
> asyncore uses select() or poll().
> 
> asyncore.poll() uses select.select(). It adds the fd to exceptfds if the fd 
> is in the readfds or writefds, then asyncore calls _exception():
> 
>          r = []; w = []; e = []
>          for fd, obj in map.items():
>              is_r = obj.readable()
>              is_w = obj.writable()
>              (...)
>              if is_r or is_w:
>                  e.append(fd)
>          (...)
> 
>          try:
>              r, w, e = select.select(r, w, e, timeout)
>          except select.error, err:
>              (...)
> 
>          (...)
> 
>          for fd in e:
>              obj = map.get(fd)
>              if obj is None:
>                  continue
>              _exception(obj)
> 
> asyncore.poll2() uses select.poll(). It only uses POLLPRI if the fd is 
> readable but always checks for error condition (POLLERR) (if asyncio waits 
> for read and/or write events):
It registers for POLLERR, POLLHUP and POLLNVAL, events one does need not 
to subscribe for. These events are output events only and should not be 
added to mask.
> 
>          for fd, obj in map.items():
>              flags = 0
>              if obj.readable():
>                  flags |= select.POLLIN | select.POLLPRI
>              # accepting sockets should not be writable
>              if obj.writable() and not obj.accepting:
>                  flags |= select.POLLOUT
>              if flags:
>                  # Only check for exceptions if object was either readable
>                  # or writable.
>                  flags |= select.POLLERR | select.POLLHUP | select.POLLNVAL
>                  pollster.register(fd, flags)
> 
Adding POLLPRI to the flags if fd is readable doesn't cut it when using 
it with sysfs gpio kernel driver. The fd for a sysfs input is ALWAYS 
readable. We want to ONLY wake on POLLPRI event.
> ----------
> 
> _______________________________________
> Python tracker <rep...@bugs.python.org>
> <https://bugs.python.org/issue30844>
> _______________________________________
>

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue30844>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to