@@ -13,15 +13,17 @@ def now():
1313 return round (time .time () * 1000 )
1414
1515class ImpulseRunner :
16- def __init__ (self , model_path : str , timeout : int = 5 ):
16+ def __init__ (self , model_path : str , timeout : int = 30 , allow_shm = True ):
1717 self ._model_path = model_path
1818 self ._tempdir = None
1919 self ._runner = None
2020 self ._client = None
2121 self ._ix = 0
2222 self ._debug = False
2323 self ._hello_resp = None
24- self ._shm = None
24+ self ._allow_shm = allow_shm
25+ self ._input_shm = None
26+ self ._freeform_output_shm = []
2527 self ._timeout = timeout
2628
2729 def init (self , debug = False ):
@@ -57,17 +59,32 @@ def init(self, debug=False):
5759
5860 hello_resp = self ._hello_resp = self .hello ()
5961
60- if ('features_shm' in hello_resp .keys ()):
61- shm_name = hello_resp ['features_shm' ]['name' ]
62- # python does not want the leading slash
63- shm_name = shm_name .lstrip ('/' )
64- shm = shared_memory .SharedMemory (name = shm_name )
65- self ._shm = {
66- 'shm' : shm ,
67- 'type' : hello_resp ['features_shm' ]['type' ],
68- 'elements' : hello_resp ['features_shm' ]['elements' ],
69- 'array' : np .ndarray ((hello_resp ['features_shm' ]['elements' ],), dtype = np .float32 , buffer = shm .buf )
70- }
62+ if self ._allow_shm :
63+ if ('features_shm' in hello_resp .keys ()):
64+ shm_name = hello_resp ['features_shm' ]['name' ]
65+ # python does not want the leading slash
66+ shm_name = shm_name .lstrip ('/' )
67+ shm = shared_memory .SharedMemory (name = shm_name )
68+ self ._input_shm = {
69+ 'shm' : shm ,
70+ 'type' : hello_resp ['features_shm' ]['type' ],
71+ 'elements' : hello_resp ['features_shm' ]['elements' ],
72+ 'array' : np .ndarray ((hello_resp ['features_shm' ]['elements' ],), dtype = np .float32 , buffer = shm .buf )
73+ }
74+
75+ if ('freeform_output_shm' in hello_resp .keys ()):
76+ for output_shm in hello_resp ['freeform_output_shm' ]:
77+ shm_name = output_shm ['name' ]
78+ # python does not want the leading slash
79+ shm_name = shm_name .lstrip ('/' )
80+ shm = shared_memory .SharedMemory (name = shm_name )
81+ self ._freeform_output_shm .append ({
82+ 'index' : output_shm ['index' ],
83+ 'shm' : shm ,
84+ 'type' : output_shm ['type' ],
85+ 'elements' : output_shm ['elements' ],
86+ 'array' : np .ndarray ((output_shm ['elements' ],), dtype = np .float32 , buffer = shm .buf )
87+ })
7188
7289 return self ._hello_resp
7390
@@ -88,18 +105,23 @@ def stop(self):
88105 # todo: in Node we send a SIGHUP after 0.5sec if process has not died, can we do this somehow here too?
89106 self ._runner = None
90107
91- if self ._shm is not None :
92- self ._shm ['shm' ].close ()
93- resource_tracker .unregister (self ._shm ['shm' ]._name , "shared_memory" )
94- self ._shm = None
108+ if self ._input_shm is not None :
109+ self ._input_shm ['shm' ].close ()
110+ resource_tracker .unregister (self ._input_shm ['shm' ]._name , "shared_memory" )
111+ self ._input_shm = None
112+
113+ for shm in self ._freeform_output_shm :
114+ shm ['shm' ].close ()
115+ resource_tracker .unregister (shm ['shm' ]._name , "shared_memory" )
116+ self ._freeform_output_shm = []
95117
96118 def hello (self ):
97119 msg = {"hello" : 1 }
98120 return self .send_msg (msg )
99121
100122 def classify (self , data ):
101- if self ._shm :
102- self ._shm ['array' ][:] = data
123+ if self ._input_shm :
124+ self ._input_shm ['array' ][:] = data
103125
104126 msg = {
105127 "classify_shm" : {
@@ -113,6 +135,13 @@ def classify(self, data):
113135 msg ["debug" ] = True
114136
115137 send_resp = self .send_msg (msg )
138+
139+ if 'result' in send_resp and 'freeform' in send_resp ['result' ] and send_resp ['result' ]['freeform' ] == 'shm' :
140+ freeform = []
141+ for shm in self ._freeform_output_shm :
142+ freeform .append (shm ['array' ].tolist ())
143+ send_resp ['result' ]['freeform' ] = freeform
144+
116145 return send_resp
117146
118147 def set_threshold (self , obj ):
0 commit comments