【发布时间】:2019-04-07 21:49:52
【问题描述】:
我的服务器类继承自 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' 中没有当前事件循环。
但是如果我从def __init__ 中删除asyncio.set_event_loop 并将其移动到def start,错误就会消失。为什么会这样?
【问题讨论】:
-
在不同的线程中运行服务器并没有真正得到任何东西。在同一个循环中运行多个服务器不会阻止请求同时处理。
-
@Vincent 但是通过 run_until_complete 在同一个循环块中运行两台服务器,以便其中一台服务器处理对另一台服务器的请求,不是吗?如何正确运行两台服务器?
标签: python python-3.5 python-multithreading python-asyncio