我想了解,是否有可能運行asyncio.Server
實例,而事件循環已經運行了run_forever
方法(從一個單獨的線程, 當然)。 據我所知,服務器可以啓動loop.run_until_complete(asyncio.start_server(...))
或 await asyncio.start_server(...)
,如果循環已經運行。 第一種方法對我來說是不可接受的,因爲循環已經由run_forever方法運行。但是我也不能使用await表達式,因爲我要從「循環區域」之外開始它(例如,從主要方法,它不能被標記爲異步,對不對?)是否有可能運行asyncio.Server實例,而事件循環已經在運行
def loop_thread(loop):
asyncio.set_event_loop(loop)
try:
loop.run_forever()
finally:
loop.close()
print("loop clesed")
class SchedulerTestManager:
def __init__(self):
...
self.loop = asyncio.get_event_loop()
self.servers_loop_thread = threading.Thread(
target=loop_thread, args=(self.loop,))
...
def start_test(self):
self.servers_loop_thread.start()
return self.servers_loop_thread
def add_router(self, router):
r = self.endpoint.add_router(router)
host = router.ConnectionParameters.Host
port = router.ConnectionParameters.Port
srv = TcpServer(host, port)
server_coro = asyncio.start_server(
self.handle_connection, self.host, self.port)
# does not work since add_router is not async
# self.server = await server_coro
# does not work, since the loop is already running
# self.server = self.loop.run_until_complete(server_coro)
return r
def maind():
st_manager = SchedulerTestManager()
thread = st_manager.start_test()
router = st_manager.add_router(router)
最簡單的解決方案是在開始測試(運行循環)之前添加所有路由器(服務器)。但我想嘗試實現它,所以當測試已經運行時可以添加路由器。我認爲loop.call_soon
(call_soon_threadsafe
)方法可以幫助我,但它似乎不能說明協程,而只是一個簡單的函數。
希望我的解釋不是很混亂。提前致謝!
謝謝!似乎這就是我要找的。 –