在这种情况下,我正在使用websockets模块。典型的服务器实现是这样的:
import websockets
start_server = websockets.serve(counter, "localhost", 6789)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
但是,我希望能够停止并重新启动服务器而不停止事件循环。从我所见过的有关asyncio服务器的最小文档以及如何做到这一点来看,我不清楚。我也不知道websockets是否以完全相同的方式实现。
例如,如果我做这样的事情:
def counter():
start_server = websockets.serve(connection_handler, 'localhost', 6789)
this = loop.run_until_complete(start_server)
try:
loop.run_forever()
finally:
this.close()
loop.run_until_complete(this.wait_closed())
loop = asyncio.get_event_loop()
loop.create_task(anothertask)
startcounter = counter()
我可以通过调用loop.stop()触发服务器停止。如何在不停止循环的情况下停止服务器(并破坏循环中正在运行的另一个任务)?
asyncio.create_task
循环已在运行时,您可以用来提交任务。在run_until_complete()
随后run_forever()
现在图案反对,因为它是不兼容的asyncio.run
,这是现在运行ASYNCIO代码的首选方式。
推荐的方法是asyncio.run
在顶层使用启动异步入口点(通常定义为async def main()
),然后从那里开始其余的工作。run_until_complete(x)
然后变得简单await x
,并且run_forever()
不需要,因为你可以等待之类的东西server.serve_forever()
或asyncio.Event
自己选择的。
由于serve_forever
websockets服务器似乎不存在,因此以下是带有事件(未经测试)的变体:
async def connection_handler(...):
...
async def test(stop_request):
# occasionally stop the server to test it
while True:
await asyncio.sleep(1)
print('requesting stop')
stop_request.set()
async def main():
stop_request = asyncio.Event()
asyncio.create_task(test(stop_request))
while True:
print('starting the server')
server = await websockets.serve(connection_handler, 'localhost', 6789)
await stop_request.wait()
stop_request.clear()
print('stopping the server')
server.close()
await server.wait_closed()
asyncio.run(main())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句