fastapi 异步应用

# 定义一个专门创建事件循环loop的函数,在另一个线程中启动它
def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()


@app.get("/addr")
def index(adcode: str = None, address: str = None, level: str = None):
    import time
    message = {"code": 500, "msg": "failed", "data": ''}
    if adcode and address and level:
        start_time = time.time()
        new_loop = asyncio.new_event_loop()  # 在当前线程下创建事件循环,(未启用),在start_loop里面启动它
        t = threading.Thread(target=start_loop, args=(new_loop,))  # 通过当前线程开启新的线程去启动事件循环
        t.start()
        coroutine1 = run_rel(address, adcode, str(level))
        ret = asyncio.run_coroutine_threadsafe(coroutine1, new_loop)  # 这几个是关键,代表在新线程中事件循环不断“游走”执行
        print(ret.result())
        print("总耗时: ", time.time() - start_time)
        message.update({"code": 200, "msg": "success", "data": ret.result()})
    return message

  

posted @ 2023-06-07 16:02  Young_Mo  阅读(102)  评论(0编辑  收藏  举报