@@ -135,12 +135,27 @@ def ensure_running(self):
135135 if not pid :
136136 # still alive
137137 return
138- # dead, launch it again
139- os .close (self ._forkserver_alive_fd )
140- self ._forkserver_authkey = None
141- self ._forkserver_address = None
142- self ._forkserver_alive_fd = None
143- self ._forkserver_pid = None
138+ if self ._forkserver_alive_fd is not None :
139+ # forkserver may be inherited from parent, is it still running?
140+ try :
141+ # check by writing a probe
142+ os .write (self ._forkserver_alive_fd , b'P' )
143+ except OSError :
144+ pass
145+ else :
146+ # still alive
147+ return
148+
149+ # dead, launch it again
150+ if self ._forkserver_alive_fd is not None :
151+ try :
152+ os .close (self ._forkserver_alive_fd )
153+ except OSError :
154+ pass
155+ self ._forkserver_authkey = None
156+ self ._forkserver_address = None
157+ self ._forkserver_alive_fd = None
158+ self ._forkserver_pid = None
144159
145160 cmd = ('from multiprocessing.forkserver import main; ' +
146161 'main(%d, %d, %r, **%r)' )
@@ -207,6 +222,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None,
207222 os .close (authkey_r )
208223 else :
209224 authkey = b''
225+ _forkserver ._forkserver_authkey = authkey
210226
211227 if preload :
212228 if sys_path is not None :
@@ -268,9 +284,16 @@ def sigchld_handler(*_unused):
268284 break
269285
270286 if alive_r in rfds :
271- # EOF because no more client processes left
272- assert os .read (alive_r , 1 ) == b'' , "Not at EOF?"
273- raise SystemExit
287+ data = os .read (alive_r , 1 )
288+ if data == b'P' :
289+ # probe from client
290+ pass
291+ elif data == b'' :
292+ # EOF because no more client processes left
293+ raise SystemExit
294+ else :
295+ raise RuntimeError ("Unknown data received in alive fd" )
296+
274297
275298 if sig_r in rfds :
276299 # Got SIGCHLD
0 commit comments