鱼C论坛

 找回密码
 立即注册
查看: 170|回复: 5

又要来求助了,关于协程的问题

[复制链接]
发表于 2024-3-18 19:28:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import asyncio
  2. import time

  3. async def fun1():
  4.     print("我是沈腾")
  5.     time.sleep(3)
  6.     print("我是沈腾")

  7. async def fun2():
  8.     print("我是张含韵")
  9.     time.sleep(2)
  10.     print("我是张含韵")

  11. async def fun3():
  12.     print("我是张涵予")
  13.     time.sleep(4)
  14.     print("我是张涵予")

  15. if __name__ == '__main__':
  16.     g1 = fun1()
  17.     g2 = fun2()
  18.     g3 = fun3()
  19.     task = [g1, g2, g3]  #把所有任务装到一个列表里
  20.     t1 = time.time()
  21.     asyncio.run(asyncio.wait(task))
  22.     t2 = time.time()
  23.     print(f"共耗费{t2-t1}秒")

复制代码


运行了,错误是
sys:1: RuntimeWarning: coroutine 'fun1' was never awaited
sys:1: RuntimeWarning: coroutine 'fun2' was never awaited
sys:1: RuntimeWarning: coroutine 'fun3' was never awaited
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-18 19:28:57 | 显示全部楼层
这个错误是因为你没有await协程对象,导致协程函数fun1、fun2和fun3没有被执行。要修复这个问题,你需要在创建协程对象时使用await关键字。

以下是修改后的代码:

  1. import asyncio
  2. import time

  3. async def fun1():
  4.     print("我是沈腾")
  5.     await asyncio.sleep(3)
  6.     print("我是沈腾")

  7. async def fun2():
  8.     print("我是张含韵")
  9.     await asyncio.sleep(2)
  10.     print("我是张含韵")

  11. async def fun3():
  12.     print("我是张涵予")
  13.     await asyncio.sleep(4)
  14.     print("我是张涵予")

  15. if __name__ == '__main__':
  16.     g1 = fun1()
  17.     g2 = fun2()
  18.     g3 = fun3()
  19.     task = [g1, g2, g3]  # 把所有任务装到一个列表里
  20.     t1 = time.time()
  21.     asyncio.run(asyncio.wait(task))
  22.     t2 = time.time()
  23.     print(f"共耗费{t2-t1}秒")
复制代码


在上面的代码中,我们使用了await关键字来等待协程函数fun1、fun2和fun3的运行结果。使用asyncio.sleep替代了time.sleep,以保证不会阻塞事件循环。最后,使用asyncio.run来运行异步任务,并使用asyncio.wait来等待所有任务完成。

希望这能帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-18 22:26:14 | 显示全部楼层
FishC 发表于 2024-3-18 19:28
这个错误是因为你没有await协程对象,导致协程函数fun1、fun2和fun3没有被执行。要修复这个问题,你需要在 ...

我试了你的代码,同样不能运行,错误一样!应该不是这个!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-18 22:26:28 | 显示全部楼层
曲折 发表于 2024-03-18 22:26
我试了你的代码,同样不能运行,错误一样!应该不是这 ...


非常抱歉,我看到了你的问题。是因为在创建协程对象之后,没有将它们添加到任务列表中去。以下是修改后的代码:

  1. import asyncio
  2. import time

  3. async def fun1():
  4.     print("我是沈腾")
  5.     await asyncio.sleep(3)
  6.     print("我是沈腾")

  7. async def fun2():
  8.     print("我是张含韵")
  9.     await asyncio.sleep(2)
  10.     print("我是张含韵")

  11. async def fun3():
  12.     print("我是张涵予")
  13.     await asyncio.sleep(4)
  14.     print("我是张涵予")

  15. if __name__ == '__main__':
  16.     tasks = [fun1(), fun2(), fun3()]   # 将所有协程对象添加到任务列表中
  17.     t1 = time.time()
  18.     asyncio.run(asyncio.wait(tasks))
  19.     t2 = time.time()
  20.     print(f"共耗费{t2-t1}秒")
复制代码


在上面的代码中,我们将fun1、fun2和fun3的调用结果添加到任务列表tasks中,然后使用asyncio.wait来等待所有任务完成。

希望这次能够解决你的问题!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-18 22:45:50 | 显示全部楼层
FishC 发表于 2024-3-18 22:26
非常抱歉,我看到了你的问题。是因为在创建协程对象之后,没有将它们添加到任务列表中去。以下是修改后 ...

还是不对哦,我已经因为我给g1 g2 g3分别赋值了FUN1等程序,所以你所说的问题不存在!问题依旧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-18 22:46:09 | 显示全部楼层
曲折 发表于 2024-03-18 22:45
还是不对哦,我已经因为我给g1 g2 g3分别赋值了FUN1等 ...


非常抱歉,我犯了个错误。你是正确的,你在给g1、g2和g3赋值时已经调用了协程函数fun1、fun2和fun3,所以不需要再在任务列表中添加这些协程对象。请改用asyncio.gather来运行并等待所有协程任务完成。以下是修改后的代码:

  1. import asyncio
  2. import time

  3. async def fun1():
  4.     print("我是沈腾")
  5.     await asyncio.sleep(3)
  6.     print("我是沈腾")

  7. async def fun2():
  8.     print("我是张含韵")
  9.     await asyncio.sleep(2)
  10.     print("我是张含韵")

  11. async def fun3():
  12.     print("我是张涵予")
  13.     await asyncio.sleep(4)
  14.     print("我是张涵予")

  15. if __name__ == '__main__':
  16.     g1 = fun1()
  17.     g2 = fun2()
  18.     g3 = fun3()

  19.     t1 = time.time()
  20.     asyncio.run(asyncio.gather(g1, g2, g3))
  21.     t2 = time.time()
  22.     print(f"共耗费{t2-t1}秒")
复制代码


这次我们使用asyncio.gather来同时运行并等待所有协程任务完成。希望这次能够解决问题!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 06:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表