mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
Fix issue 10527: make multiprocessing use poll() instead of select() if available.
This commit is contained in:
commit
b4f39e85f2
3 changed files with 27 additions and 2 deletions
|
@ -509,6 +509,27 @@ if sys.platform != 'win32':
|
||||||
return c1, c2
|
return c1, c2
|
||||||
|
|
||||||
else:
|
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]
|
||||||
|
|
||||||
def Pipe(duplex=True):
|
def Pipe(duplex=True):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -2102,6 +2102,7 @@ class _TestConnection(BaseTestCase):
|
||||||
self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
|
self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
|
||||||
|
|
||||||
conn.send(None)
|
conn.send(None)
|
||||||
|
time.sleep(.1)
|
||||||
|
|
||||||
self.assertEqual(poll(TIMEOUT1), True)
|
self.assertEqual(poll(TIMEOUT1), True)
|
||||||
self.assertTimingAlmostEqual(poll.elapsed, 0)
|
self.assertTimingAlmostEqual(poll.elapsed, 0)
|
||||||
|
@ -3251,6 +3252,7 @@ class TestWait(unittest.TestCase):
|
||||||
from multiprocessing.connection import wait
|
from multiprocessing.connection import wait
|
||||||
|
|
||||||
expected = 3
|
expected = 3
|
||||||
|
sorted_ = lambda l: sorted(l, key=lambda x: isinstance(x, int))
|
||||||
sem = multiprocessing.Semaphore(0)
|
sem = multiprocessing.Semaphore(0)
|
||||||
a, b = multiprocessing.Pipe()
|
a, b = multiprocessing.Pipe()
|
||||||
p = multiprocessing.Process(target=self.signal_and_sleep,
|
p = multiprocessing.Process(target=self.signal_and_sleep,
|
||||||
|
@ -3274,7 +3276,7 @@ class TestWait(unittest.TestCase):
|
||||||
res = wait([a, p.sentinel, b], 20)
|
res = wait([a, p.sentinel, b], 20)
|
||||||
delta = time.time() - start
|
delta = time.time() - start
|
||||||
|
|
||||||
self.assertEqual(res, [p.sentinel, b])
|
self.assertEqual(sorted_(res), sorted_([p.sentinel, b]))
|
||||||
self.assertLess(delta, 0.4)
|
self.assertLess(delta, 0.4)
|
||||||
|
|
||||||
b.send(None)
|
b.send(None)
|
||||||
|
@ -3283,7 +3285,7 @@ class TestWait(unittest.TestCase):
|
||||||
res = wait([a, p.sentinel, b], 20)
|
res = wait([a, p.sentinel, b], 20)
|
||||||
delta = time.time() - start
|
delta = time.time() - start
|
||||||
|
|
||||||
self.assertEqual(res, [a, p.sentinel, b])
|
self.assertEqual(sorted_(res), sorted_([a, p.sentinel, b]))
|
||||||
self.assertLess(delta, 0.4)
|
self.assertLess(delta, 0.4)
|
||||||
|
|
||||||
p.terminate()
|
p.terminate()
|
||||||
|
|
|
@ -200,6 +200,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue 10527: make multiprocessing use poll() instead of select() if available.
|
||||||
|
|
||||||
- Issue #16688: Fix backreferences did make case-insensitive regex fail on
|
- Issue #16688: Fix backreferences did make case-insensitive regex fail on
|
||||||
non-ASCII strings. Patch by Matthew Barnett.
|
non-ASCII strings. Patch by Matthew Barnett.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue