代码之家  ›  专栏  ›  技术社区  ›  bux

如何在线程中运行aiohtp服务器?

  •  3
  • bux  · 技术社区  · 7 年前

    此线程中的aiohtp服务器示例失败 RuntimeError: There is no current event loop in thread 'Thread-1'. 错误:

    import threading
    from aiohttp import web
    
    
    def aiohttp_server():
        def say_hello(request):
            return web.Response(text='Hello, world')
    
        app = web.Application(debug=True)
        app.add_routes([web.get('/', say_hello)])
        web.run_app(app)
    
    
    t = threading.Thread(target=aiohttp_server)
    t.start()
    

    如何在线程中运行aiohtp服务器?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Sraw    7 年前

    handler

    import asyncio
    import threading
    from aiohttp import web
    
    
    def aiohttp_server():
        def say_hello(request):
            return web.Response(text='Hello, world')
    
        app = web.Application(debug=True)
        app.add_routes([web.get('/', say_hello)])
        handler = app.make_handler()
        return handler
    
    
    def run_server(handler):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        server = loop.create_server(handler, host='127.0.0.1', port=8089)
        loop.run_until_complete(server)
        loop.run_forever()
    
    
    t = threading.Thread(target=run_server, args=(aiohttp_server(),))
    t.start()
    
        2
  •  1
  •   user4815162342    7 年前

    app.make_handler

    import asyncio
    import threading
    from aiohttp import web
    
    loop = asyncio.get_event_loop()
    
    
    def say_hello(request):
        return web.Response(text='Hello, world')
    
    
    app = web.Application(debug=True)
    app.add_routes([web.get('/', say_hello)])
    
    handler = app.make_handler()
    server = loop.create_server(handler, host='127.0.0.1', port=8080)
    
    
    def aiohttp_server():
        loop.run_until_complete(server)
        loop.run_forever()
    
    
    t = threading.Thread(target=aiohttp_server)
    t.start()
    
        3
  •  0
  •   Heron Rossi    6 年前

    https://docs.aiohttp.org/en/stable/web_advanced.html#application-runners

    from aiohttp import web
    import asyncio
    
    
    async def healthz(request):
        return web.Response(text="OK")
    
    app = web.Application()
    app.add_routes([web.get("/", healthz)])
    
    
    async def runner():
        runner = web.AppRunner(app)
        await runner.setup()
        site = web.TCPSite(runner, "localhost", 8080)
        await site.start()
    
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(runner())