继承 APIView 的方法,发现每个请求都是单独的 event loop ,
wait task 318760 future data, future: 140251998671568, loop:140251997385056
set task 318760 future data, future: 140251998671568, loop:140251997385056
wait task 318762 future data, future: 140251998681952, loop:140251998919920
set task 318761 future data, future: 140251997477472, loop:140251997378624
你在 A 请求里
future = loop.create_future()
result = await asyncio.wait_for(future, timeout=timeout)
把 future 传给另一个线程(比如 websocket executor),还得把 loop 一起传过去,
async with task_store.lock:
future, loop = task_store.task_results.pop(task_id, (None, None))
if future:
logger.info(f"set task {task_id} future data, future: {id(future)}, loop:{id(loop)}")
loop.call_soon_threadsafe(future.set_result, result_data)
else:
logger.warning(f"can not find active task {task_id}")
相当于每个请求还是独立的线程,然后在线程里搞 async io 。这有啥意义啊。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.