使用python asyncio为什么不能从另一个线程中恢复等待中的Feture?

楚艺
  • 0
新手上路,请多包涵

任务描述

在python中模拟一个协程任务,await一个Feture,任务提交到另一个线程,当另一个协程完成任务时Feture set_result后激活主线程中的await。

代码如下

import threading  
import time  
import asyncio  
  
loop = asyncio.get_event_loop()  
  
  
async def test_future():  
  
    f = asyncio.Future()  
  
    def sch(future):  
        print("sch begin")  
        time.sleep(1)  
        future.set_result('aaa')  
        print("sch finish")  
  
    th = threading.Thread(target=sch, args=(f,))  
    th.start()  
    y = await f  
    print("y", y)  
    return "abc"  
  
  
async def main():  
    aaa = await test_future()  
    print(aaa)  
  
  
print("start loop")  
loop.run_until_complete(main())  
print("fin")
  • 控制台输出如下
Connected to pydev debugger (build 183.5429.31)
start loop
sch begin
sch finish

疑惑及补充说明

  1. 在sch函数中feture set_result后为啥没有激活主线程中的await?
  2. 如果在y = await f那一行断点足够多时间超过time.sleep(1)时间,即待任务线程结束后,继续断点这个时候才符合预期,控制台输出如下:
Connected to pydev debugger (build 183.5429.31)
start loop
sch begin
sch finish
y aaa
abc
fin

Process finished with exit code 0
回复
阅读 614
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏