@@ -23,6 +23,7 @@ def __init__(self):
2323self .result_queue = Queue ()
2424self .awaiting_input = False
2525self .process = None
26+ self .fresh_process = True
2627self .start_process ()
2728
2829@atexit .register
@@ -31,6 +32,7 @@ def cleanup():
3132self .process .terminate ()
3233
3334def start_process (self ):
35+ self .fresh_process = True
3436self .process = Process (
3537target = worker_loop_in_thread ,
3638args = (self .task_queue ,self .input_queue ,self .result_queue ),
@@ -62,12 +64,11 @@ def await_result(self):
6264def _await_result (self ):
6365# TODO cancel if result was cancelled by a newer handle_entry
6466result = None
65- # TODO handle initial timeout better
66- timeout = 10
6767while result is None :
68+ timeout = 10 if self .fresh_process else 3
6869try :
6970result = self .result_queue .get (timeout = timeout )
70- timeout = 3
71+ assert ( result is None ) == self . fresh_process
7172except queue .Empty :
7273alive = self .process .is_alive ()
7374print (f"Process{ alive = } " )
@@ -82,14 +83,19 @@ def _await_result(self):
8283 ],
8384output = 'The process died.' ,
8485 )
86+ self .fresh_process = False
8587return result
8688
8789
8890user_processes = defaultdict (UserProcess )
8991
9092app = flask .Flask (__name__ )
9193
92- multiprocessing .set_start_method ("spawn" )
94+ try :
95+ multiprocessing .set_start_method ("spawn" )
96+ except RuntimeError :
97+ # noinspection PyArgumentList
98+ assert multiprocessing .get_start_method ()== "spawn"
9399
94100
95101@app .route ("/run" ,methods = ["POST" ])