Мои классы серверов унаследованы от BaseServer
:
class BaseServer(object):
def __init__(self, host, port):
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
self.instance = asyncio.start_server(self.handle_connection, host = host, port = port)
async def handle_connection(self, reader: StreamReader, writer: StreamWriter):
pass
def start(self):
# wrapping coroutine into ensure_future to allow it to call from call_soon
# wrapping into lambda to make it callable
callback = asyncio.ensure_future(self.instance)
self.loop.call_soon(lambda: callback)
self.loop.run_forever()
self.loop.close()
def stop(self):
self.loop.call_soon_threadsafe(self.loop.stop)
@staticmethod
def get_instance():
return BaseServer(None, None)
Мне нужно, чтобы два сервера работали в собственном потоке для параллельной обработки запросов.
Но когда я пытаюсь запустить их по мере необходимости, работает только первый сервер. Ниже, как я их запускаю:
if __name__ == '__main__':
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
async def run():
pool = ThreadPoolExecutor(max_workers=cpu_count())
await loop.run_in_executor(pool, Server1.get_instance().start)
await loop.run_in_executor(pool, Server2.get_instance().start)
loop.run_until_complete(run())
- Что я делаю не так? Как запустить каждый сервер в собственном потоке?
- Когда
asyncio.set_event_loop
звонит с def __init__
Я получил следующую ошибку:
RuntimeError: В потоке 'Thread-1' нет текущего цикла событий.
Но если я уберу asyncio.set_event_loop
из def __init__
и переместу его в def start
, ошибка исчезнет. Почему это случилось?