11import logging
22import sys
33from socket import gethostname
4- from typing import Optional
4+ from typing import Any , Optional
55
66import cloudpickle
77import zmq
88
99
10+ class ExecutorlibSocketError (RuntimeError ):
11+ pass
12+
13+
1014class SocketInterface :
1115 """
1216 The SocketInterface is an abstraction layer on top of the zero message queue.
1317
1418 Args:
1519 spawner (executorlib.shared.spawner.BaseSpawner): Interface for starting the parallel process
1620 log_obj_size (boolean): Enable debug mode which reports the size of the communicated objects.
21+ time_out_ms (int): Time out for waiting for a message on socket in milliseconds.
1722 """
1823
19- def __init__ (self , spawner = None , log_obj_size = False ):
24+ def __init__ (
25+ self , spawner = None , log_obj_size : bool = False , time_out_ms : int = 1000
26+ ):
2027 """
2128 Initialize the SocketInterface.
2229
2330 Args:
2431 spawner (executorlib.shared.spawner.BaseSpawner): Interface for starting the parallel process
32+ log_obj_size (boolean): Enable debug mode which reports the size of the communicated objects.
33+ time_out_ms (int): Time out for waiting for a message on socket in milliseconds.
2534 """
2635 self ._context = zmq .Context ()
2736 self ._socket = self ._context .socket (zmq .PAIR )
37+ self ._poller = zmq .Poller ()
38+ self ._poller .register (self ._socket , zmq .POLLIN )
2839 self ._process = None
40+ self ._time_out_ms = time_out_ms
41+ self ._logger : Optional [logging .Logger ] = None
2942 if log_obj_size :
3043 self ._logger = logging .getLogger ("executorlib" )
31- else :
32- self ._logger = None
3344 self ._spawner = spawner
3445
3546 def send_dict (self , input_dict : dict ):
@@ -52,7 +63,12 @@ def receive_dict(self) -> dict:
5263 Returns:
5364 dict: dictionary with response received from the connected client
5465 """
55- data = self ._socket .recv ()
66+ response_lst : list [tuple [Any , int ]] = []
67+ while len (response_lst ) == 0 :
68+ response_lst = self ._poller .poll (self ._time_out_ms )
69+ if not self ._spawner .poll ():
70+ raise ExecutorlibSocketError ()
71+ data = self ._socket .recv (zmq .NOBLOCK )
5672 if self ._logger is not None :
5773 self ._logger .warning (
5874 "Received dictionary of size: " + str (sys .getsizeof (data ))
0 commit comments