|
@@ -110,10 +110,43 @@ def _get_job_writer(job):
|
|
|
return writer() # is a weakref
|
|
|
|
|
|
|
|
|
+if hasattr(select, 'poll', None):
|
|
|
+ def _select_imp(readers=None, writers=None, err=None, timeout=0,
|
|
|
+ poll=select.poll, POLLIN=select.POLLIN,
|
|
|
+ POLLOUT=select.POLLOUT, POLLERR=select.POLLERR):
|
|
|
+ poller = poll()
|
|
|
+ register = poller.register
|
|
|
+
|
|
|
+ if readers:
|
|
|
+ [register(fd, POLLIN) for fd in readers]
|
|
|
+ if writers:
|
|
|
+ [register(fd, POLLOUT) for fd in writers]
|
|
|
+ if err:
|
|
|
+ [register(fd, POLLERR) for fd in err]
|
|
|
+
|
|
|
+ R, W = set(), set()
|
|
|
+ timeout = 0 if timeout and timeout < 0 else round(timeout * 1e3)
|
|
|
+ events = poller.poll(timeout)
|
|
|
+ for fd, event in events:
|
|
|
+ if not isinstance(fd, Integral):
|
|
|
+ fd = fd.fileno()
|
|
|
+ if event & POLLIN:
|
|
|
+ R.add(fd)
|
|
|
+ if event & POLLOUT:
|
|
|
+ W.add(fd)
|
|
|
+ if event & POLLERR:
|
|
|
+ R.add(fd)
|
|
|
+ return R, W, 0
|
|
|
+else:
|
|
|
+ def _select_imp(readers=None, writers=None, err=None, timeout=0):
|
|
|
+ r, w, e = select.select(readers, writers, err, timeout)
|
|
|
+ if e:
|
|
|
+ r = list(set(r) | set(e))
|
|
|
+ return r, w, 0
|
|
|
+
|
|
|
+
|
|
|
def _select(readers=None, writers=None, err=None, timeout=0,
|
|
|
- poll=getattr(select, 'poll', select.select),
|
|
|
- POLLIN=select.POLLIN, POLLOUT=select.POLLOUT,
|
|
|
- POLLERR=select.POLLERR):
|
|
|
+ _select_imp=_select_imp):
|
|
|
"""Simple wrapper to :class:`~select.select`, using :`~select.poll`
|
|
|
as the implementation.
|
|
|
|
|
@@ -136,30 +169,8 @@ def _select(readers=None, writers=None, err=None, timeout=0,
|
|
|
readers = set() if readers is None else readers
|
|
|
writers = set() if writers is None else writers
|
|
|
err = set() if err is None else err
|
|
|
- poller = poll()
|
|
|
- register = poller.register
|
|
|
-
|
|
|
- if readers:
|
|
|
- [register(fd, POLLIN) for fd in readers]
|
|
|
- if writers:
|
|
|
- [register(fd, POLLOUT) for fd in writers]
|
|
|
- if err:
|
|
|
- [register(fd, POLLERR) for fd in err]
|
|
|
-
|
|
|
- R, W = set(), set()
|
|
|
- timeout = 0 if timeout and timeout < 0 else round(timeout * 1e3)
|
|
|
try:
|
|
|
- events = poller.poll(timeout)
|
|
|
- for fd, event in events:
|
|
|
- if not isinstance(fd, Integral):
|
|
|
- fd = fd.fileno()
|
|
|
- if event & POLLIN:
|
|
|
- R.add(fd)
|
|
|
- if event & POLLOUT:
|
|
|
- W.add(fd)
|
|
|
- if event & POLLERR:
|
|
|
- R.add(fd)
|
|
|
- return R, W, 0
|
|
|
+ return _select_imp(readers, writers, err, timeout)
|
|
|
except (select.error, socket.error) as exc:
|
|
|
if exc.errno == errno.EINTR:
|
|
|
return set(), set(), 1
|