How to run an aiohttp server in a thread?

前端 未结 4 944
独厮守ぢ
独厮守ぢ 2021-01-18 02:18

This example of aiohttp server in a thread fails with an RuntimeError: There is no current event loop in thread \'Thread-1\'. error:

import thre         


        
4条回答
  •  执笔经年
    2021-01-18 02:31

    Create handler in main thread and manually create an event loop in child thread.

    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()
    

    Update

    For new aiohttp, use the following, thank @Auyer for notification.

    import asyncio
    import threading
    from aiohttp import web
    
    
    def aiohttp_server():
        def say_hello(request):
            return web.Response(text='Hello, world')
    
        app = web.Application()
        app.add_routes([web.get('/', say_hello)])
        runner = web.AppRunner(app)
        return runner
    
    
    def run_server(runner):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(runner.setup())
        site = web.TCPSite(runner, 'localhost', 8080)
        loop.run_until_complete(site.start())
        loop.run_forever()
    
    
    t = threading.Thread(target=run_server, args=(aiohttp_server(),))
    t.start()
    

提交回复
热议问题