Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e241ac9

Browse files
committed
Issue #18934: multiprocessing: use selectors module.
1 parent a83a022 commit e241ac9

2 files changed

Lines changed: 26 additions & 39 deletions

File tree

Lib/multiprocessing/connection.py

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import io
1313
import os
1414
import sys
15-
import select
1615
import socket
1716
import struct
1817
import errno
@@ -877,48 +876,30 @@ def wait(object_list, timeout=None):
877876

878877
else:
879878

880-
if hasattr(select, 'poll'):
881-
def _poll(fds, timeout):
882-
if timeout is not None:
883-
timeout = int(timeout * 1000) # timeout is in milliseconds
884-
fd_map = {}
885-
pollster = select.poll()
886-
for fd in fds:
887-
pollster.register(fd, select.POLLIN)
888-
if hasattr(fd, 'fileno'):
889-
fd_map[fd.fileno()] = fd
890-
else:
891-
fd_map[fd] = fd
892-
ls = []
893-
for fd, event in pollster.poll(timeout):
894-
if event & select.POLLNVAL:
895-
raise ValueError('invalid file descriptor %i' % fd)
896-
ls.append(fd_map[fd])
897-
return ls
898-
else:
899-
def _poll(fds, timeout):
900-
return select.select(fds, [], [], timeout)[0]
901-
879+
import selectors
902880

903881
def wait(object_list, timeout=None):
904882
'''
905883
Wait till an object in object_list is ready/readable.
906884
907885
Returns list of those objects in object_list which are ready/readable.
908886
'''
909-
if timeout is not None:
910-
if timeout <= 0:
911-
return _poll(object_list, 0)
912-
else:
913-
deadline = time.time() + timeout
914-
while True:
915-
try:
916-
return _poll(object_list, timeout)
917-
except OSError as e:
918-
if e.errno != errno.EINTR:
919-
raise
887+
with selectors.DefaultSelector() as selector:
888+
for obj in object_list:
889+
selector.register(obj, selectors.EVENT_READ)
890+
920891
if timeout is not None:
921-
timeout = deadline - time.time()
892+
deadline = time.time() + timeout
893+
894+
while True:
895+
ready = selector.select(timeout)
896+
if ready:
897+
return [key.fileobj for (key, events) in ready]
898+
else:
899+
if timeout is not None:
900+
timeout = deadline - time.time()
901+
if timeout < 0:
902+
return ready
922903

923904
#
924905
# Make connection and socket objects sharable if possible

Lib/multiprocessing/forkserver.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import errno
22
import os
3-
import select
3+
import selectors
44
import signal
55
import socket
66
import struct
@@ -149,14 +149,20 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
149149

150150
# ignoring SIGCHLD means no need to reap zombie processes
151151
handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN)
152-
with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener:
152+
with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \
153+
selectors.DefaultSelector() as selector:
153154
global _forkserver_address
154155
_forkserver_address = listener.getsockname()
155-
readers = [listener, alive_r]
156+
157+
selector.register(listener, selectors.EVENT_READ)
158+
selector.register(alive_r, selectors.EVENT_READ)
156159

157160
while True:
158161
try:
159-
rfds, wfds, xfds = select.select(readers, [], [])
162+
while True:
163+
rfds = [key.fileobj for (key, events) in selector.select()]
164+
if rfds:
165+
break
160166

161167
if alive_r in rfds:
162168
# EOF because no more client processes left

0 commit comments

Comments
 (0)