鱼C论坛

 找回密码
 立即注册
查看: 2613|回复: 1

[已解决]python协程问题

[复制链接]
发表于 2023-4-24 21:02:51 | 显示全部楼层 |阅读模式
15鱼币
我是Windows系统,输入的代码如下,想问问该怎么解决这个问题呀
  1. import asyncio

  2. async def fun1():
  3.     print('I am INsider1')
  4.     await asyncio.sleep(1)
  5.     print('1finished')

  6. async def fun2():
  7.     print("I am INsider2")
  8.     await asyncio.sleep(2)
  9.     print("2finished")

  10. async def fun3():
  11.     print("I am INsider3")
  12.     await asyncio.sleep(3)
  13.     print("3finished")

  14. if __name__ == '__main__':
  15.     f1 = fun1()
  16.     f2 = fun2()
  17.     f3 = fun3()

  18.     fs = [f1,f2,f3]
  19.     event_loop = asyncio.get_event_loop()
  20.     event_loop.run_until_complete(asyncio.wait(fs))
复制代码



报错如下:
  1.     raise TypeError("Passing coroutines is forbidden, use tasks explicitly.")
  2. TypeError: Passing coroutines is forbidden, use tasks explicitly.
  3. sys:1: RuntimeWarning: coroutine 'fun1' was never awaited
  4. sys:1: RuntimeWarning: coroutine 'fun2' was never awaited
  5. sys:1: RuntimeWarning: coroutine 'fun3' was never awaited
复制代码

最佳答案
2023-4-24 21:02:52
从您的错误提示来看,问题出在您将协程函数直接传递给`asyncio.wait()`。解决这个问题的方法是使用`asyncio.create_task()`将协程函数包装为任务对象,然后传递这些任务对象给`asyncio.wait()`。请修改您的代码如下:

  1. import asyncio

  2. async def fun1():
  3.     print('I am INsider1')
  4.     await asyncio.sleep(1)
  5.     print('1finished')

  6. async def fun2():
  7.     print("I am INsider2")
  8.     await asyncio.sleep(2)
  9.     print("2finished")

  10. async def fun3():
  11.     print("I am INsider3")
  12.     await asyncio.sleep(3)
  13.     print("3finished")

  14. if __name__ == '__main__':
  15.     f1 = fun1()
  16.     f2 = fun2()
  17.     f3 = fun3()

  18.     fs = [f1,f2,f3]
  19.    
  20.     event_loop = asyncio.get_event_loop()
  21.    
  22.     # 将协程对象包装为任务对象
  23.     tasks = [event_loop.create_task(f) for f in fs]

  24.     # 将任务对象传递给 asyncio.wait
  25.     event_loop.run_until_complete(asyncio.wait(tasks))
复制代码


现在,您的代码应该可以正常运行并输出预期结果。另外,从Python 3.7开始,可以使用`asyncio.run()`简化事件循环的创建和关闭操作,不过这需要将您的代码封装在一个异步函数中。如果您的Python版本 >= 3.7,可以考虑将代码改成如下:

  1. import asyncio

  2. async def fun1():
  3.     print('I am INsider1')
  4.     await asyncio.sleep(1)
  5.     print('1finished')

  6. async def fun2():
  7.     print("I am INsider2")
  8.     await asyncio.sleep(2)
  9.     print("2finished")

  10. async def fun3():
  11.     print("I am INsider3")
  12.     await asyncio.sleep(3)
  13.     print("3finished")

  14. async def main():
  15.     f1 = fun1()
  16.     f2 = fun2()
  17.     f3 = fun3()

  18.     fs = [f1,f2,f3]
  19.    
  20.     tasks = [asyncio.create_task(f) for f in fs]
  21.     await asyncio.wait(tasks)

  22. if __name__ == '__main__':
  23.     asyncio.run(main())
复制代码


这样,代码会更简洁。

最佳答案

查看完整内容

从您的错误提示来看,问题出在您将协程函数直接传递给`asyncio.wait()`。解决这个问题的方法是使用`asyncio.create_task()`将协程函数包装为任务对象,然后传递这些任务对象给`asyncio.wait()`。请修改您的代码如下: 现在,您的代码应该可以正常运行并输出预期结果。另外,从Python 3.7开始,可以使用`asyncio.run()`简化事件循环的创建和关闭操作,不过这需要将您的代码封装在一个异步函数中。如果您的Python版本 >= 3.7 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-24 21:02:52 | 显示全部楼层    本楼为最佳答案   
从您的错误提示来看,问题出在您将协程函数直接传递给`asyncio.wait()`。解决这个问题的方法是使用`asyncio.create_task()`将协程函数包装为任务对象,然后传递这些任务对象给`asyncio.wait()`。请修改您的代码如下:

  1. import asyncio

  2. async def fun1():
  3.     print('I am INsider1')
  4.     await asyncio.sleep(1)
  5.     print('1finished')

  6. async def fun2():
  7.     print("I am INsider2")
  8.     await asyncio.sleep(2)
  9.     print("2finished")

  10. async def fun3():
  11.     print("I am INsider3")
  12.     await asyncio.sleep(3)
  13.     print("3finished")

  14. if __name__ == '__main__':
  15.     f1 = fun1()
  16.     f2 = fun2()
  17.     f3 = fun3()

  18.     fs = [f1,f2,f3]
  19.    
  20.     event_loop = asyncio.get_event_loop()
  21.    
  22.     # 将协程对象包装为任务对象
  23.     tasks = [event_loop.create_task(f) for f in fs]

  24.     # 将任务对象传递给 asyncio.wait
  25.     event_loop.run_until_complete(asyncio.wait(tasks))
复制代码


现在,您的代码应该可以正常运行并输出预期结果。另外,从Python 3.7开始,可以使用`asyncio.run()`简化事件循环的创建和关闭操作,不过这需要将您的代码封装在一个异步函数中。如果您的Python版本 >= 3.7,可以考虑将代码改成如下:

  1. import asyncio

  2. async def fun1():
  3.     print('I am INsider1')
  4.     await asyncio.sleep(1)
  5.     print('1finished')

  6. async def fun2():
  7.     print("I am INsider2")
  8.     await asyncio.sleep(2)
  9.     print("2finished")

  10. async def fun3():
  11.     print("I am INsider3")
  12.     await asyncio.sleep(3)
  13.     print("3finished")

  14. async def main():
  15.     f1 = fun1()
  16.     f2 = fun2()
  17.     f3 = fun3()

  18.     fs = [f1,f2,f3]
  19.    
  20.     tasks = [asyncio.create_task(f) for f in fs]
  21.     await asyncio.wait(tasks)

  22. if __name__ == '__main__':
  23.     asyncio.run(main())
复制代码


这样,代码会更简洁。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 01:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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