# 定义一个专门创建事件循环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