aiohttp 子线程启动/中止服务

import time, threading
from aiohttp import web
import asyncio


async def handler(request):
    return web.Response(text="OK")


async def run_server():
    server = web.Server(handler)
    runner = web.ServerRunner(server)
    await runner.setup()
    site = web.TCPSite(runner, "127.0.0.1", 8080)
    await site.start()

    print(f"======= Serving on http://{site._host}:{site._port}/ ======")

    return site


async def server_container(ft: asyncio.Future):
    site = await run_server()
    await ft  # 等待约定的信号传过来
    await site.stop()




# tcpserver 服务线程
def sc_main(loop, ft: asyncio.Future):

    asyncio.set_event_loop(loop)
    try:
        loop.run_until_complete(server_container(ft))
    except KeyboardInterrupt:
        pass
    loop.close()
    print("sc_main over")


# 操作者线程
def fr_main(loop: asyncio.AbstractEventLoop, ft: asyncio.Future):
    time.sleep(3)
    loop.call_soon_threadsafe(ft.set_result, None)  # 发送约定的信号
    print("fr_main over")


def main():
    loop = asyncio.new_event_loop()
    ft = asyncio.Future(loop=loop)

    th1 = threading.Thread(target=fr_main, args=(loop, ft))
    th2 = threading.Thread(target=sc_main, args=(loop, ft))
    th1.start()
    th2.start()
    th1.join()
    th2.join()

    print("all over")


if __name__ == "__main__":

    main()
posted @ 2022-04-27 12:32  方头狮  阅读(169)  评论(0)    收藏  举报