Fix issue 10527: make multiprocessing use poll() instead of select() if available.

This commit is contained in:
Giampaolo Rodola' 2012-12-31 17:23:09 +01:00
parent c7ce3f7be5
commit 5e844c8052
3 changed files with 24 additions and 0 deletions

View File

@ -213,6 +213,27 @@ if sys.platform != 'win32':
return c1, c2
else:
if hasattr(select, 'poll'):
def _poll(fds, timeout):
if timeout is not None:
timeout = int(timeout) * 1000 # timeout is in milliseconds
fd_map = {}
pollster = select.poll()
for fd in fds:
pollster.register(fd, select.POLLIN)
if hasattr(fd, 'fileno'):
fd_map[fd.fileno()] = fd
else:
fd_map[fd] = fd
ls = []
for fd, event in pollster.poll(timeout):
if event & select.POLLNVAL:
raise ValueError('invalid file descriptor %i' % fd)
ls.append(fd_map[fd])
return ls
else:
def _poll(fds, timeout):
return select.select(fds, [], [], timeout)[0]
from _multiprocessing import win32

View File

@ -1574,6 +1574,7 @@ class _TestConnection(BaseTestCase):
self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
conn.send(None)
time.sleep(.1)
self.assertEqual(poll(TIMEOUT1), True)
self.assertTimingAlmostEqual(poll.elapsed, 0)

View File

@ -189,6 +189,8 @@ Core and Builtins
Library
-------
- Issue 10527: make multiprocessing use poll() instead of select() if available.
- Issue #16485: Fix file descriptor not being closed if file header patching
fails on closing of aifc file.