def run(self, terminator=None, silent=False): def protocol_factory(): return ServerProtocol(self) while True: self.keep_running = False self.loop = asyncio.ProactorEventLoop() self.process_runner = ProcessRunner(self.compile_slots, self.loop) # Data shared between sessions. self._misc_thread_pool = ThreadPoolExecutor(max_workers=2 * cpu_count()) self._header_repository = HeaderRepository(self.scratch_dir) self._pch_repository = PCHRepository(self.scratch_dir) self._compiler_repository = CompilerRepository() self._scheduler = sched.scheduler() self.server = self.loop.run_until_complete(self.loop.create_server( protocol_factory, family=socket.AF_INET, port=self.port)) if self.port == 0: self.port = self.server.sockets[0].getsockname()[1] beacon = Beacon(self.compile_slots, self.port) beacon.start() if not silent: print("Running server on 'localhost:{}'.".format(self.port)) print("Using {} job slots.".format(self.compile_slots)) try: def stop(): self.loop.stop() if terminator: terminator.initialize(stop) self.run_event_loop(silent) finally: beacon.stop() self.server.close() self.loop.stop() self.loop.close() self.misc_thread_pool().shutdown() if not self.keep_running: break
def run_beacon(request): beacon = Beacon(request.param[0], request.param[1]) beacon.start(port=MULTICAST_PORT) request.addfinalizer(beacon.stop) return request.param[0], request.param[1]