Ver código fonte

implement network.ready

justheuristic 5 anos atrás
pai
commit
72f92324c1
2 arquivos alterados com 13 adições e 2 exclusões
  1. 12 1
      tesseract/network/__init__.py
  2. 1 1
      tesseract/server/__init__.py

+ 12 - 1
tesseract/network/__init__.py

@@ -19,9 +19,10 @@ class TesseractNetwork(mp.Process):
         super().__init__()
         self.port, self.initial_peers = port, initial_peers
         self._pipe, self.pipe = mp.Pipe(duplex=False)
+        self.ready = mp.Event()
         self.server = Server()
         if start:
-            self.start()
+            self.run_in_background(await_ready=True)
 
     def run(self) -> None:
         loop = asyncio.new_event_loop()
@@ -29,11 +30,21 @@ class TesseractNetwork(mp.Process):
         loop.run_until_complete(self.server.listen(self.port))
         loop.run_until_complete(self.server.bootstrap(self.initial_peers))
         run_forever(loop.run_forever)
+        self.ready.set()
 
         while True:
             method, args, kwargs = self._pipe.recv()
             getattr(self, method)(*args, **kwargs)
 
+    def run_in_background(self, await_ready=True, timeout=None):
+        """
+        Starts TesseractNetwork in a background process. if await_ready, this method will wait until background network
+        is ready to process incoming requests or for :timeout: seconds max.
+        """
+        self.start()
+        if await_ready and not self.ready.wait(timeout=timeout):
+            raise TimeoutError("TesseractServer didn't notify .ready in {timeout} seconds")
+
     def shutdown(self) -> None:
         """ Shuts down the network process """
         if self.is_alive():

+ 1 - 1
tesseract/server/__init__.py

@@ -52,7 +52,7 @@ class TesseractServer(threading.Thread):
         """
         if self.network:
             if not self.network.is_alive():
-                self.network.start()
+                self.network.run_in_background(await_ready=True)
 
             network_thread = NetworkHandlerThread(experts=self.experts, network=self.network,
                                                   addr=self.addr, port=self.port, update_period=self.update_period)