喂猪吃鸡腿 2021-09-23 11:30 采纳率: 47.8%
浏览 28
已结题

python异步调用函数报错

import asyncio
import websockets
from threading import Timer


async def fun():
    print("hello, world")
    Timer(1, fun).run()


loop = asyncio.get_event_loop()
loop.run_until_complete(fun())
loop.close()

img


请问一下这个问题是因为什么呢,怎么解决

  • 写回答

1条回答 默认 最新

  • 咕泡-三木 2021-09-23 14:23
    关注

    asynnc/await协程语法是python3.7增加的新特性,尽管3.10都快发布了,但是协程这块还是有很多人不熟悉

    基本概念 1. 协程是在单个线程中执行的多个任务
    基本概念 2. asynnc/await要成对出现

    Timer(1, fun).run()
    

    这行代码做了什么呢

    1. 协程中创建了新线程 # 违背基本概念1
    2. 新线程中又创建了新协程
    3. 创建了新协程却不等待它 # 违背基本概念2

    于是出现了 never awaited的提示

    正确的例子:

    import asyncio
    
    
    async def fun():  # async 定义协程
        print("hello, ")
        await asyncio.sleep(1)  # await 等待另一个协程结束
        print(" world")
    
    
    loop = asyncio.get_event_loop()  # 从当前线程中创建时间循环
    loop.run_until_complete(fun())  # 执行协程,并等待完成
    loop.close()
    

    需要注意的是,以上代码只是使用了async/await的语法实现了异步,却没有实现并发
    各中差别还需细细体味


    协程是线程开销更低,但更复杂的并发编程方式,如果感觉吃力是正常的,建议先从多线程开始学起
    如有帮助,还请【采纳】

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月18日
  • 创建了问题 9月23日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误