往后,余生 2019-11-01 16:42 采纳率: 0%
浏览 7485

报错TypeError: object NoneType can't be used in 'await' expression?

asyncio异步编程,给字典赋值,总是提示NoneType。

完整代码如下

import asyncio
import time
hs={}
def asy():
    #asynchronous
    start=time.perf_counter()
    def fn(i):
        hs[i]=i**9
    async def fastdofn(i):
        await fn(i)
    tasks=[asyncio.ensure_future(fastdofn(i)) for i in range(10)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    print(hs)
    print('runtime : {}'.format(time.perf_counter()-start))
asy()

运行结果:

{0: 0, 1: 1, 2: 512, 3: 19683, 4: 262144, 5: 1953125, 6: 10077696, 7: 40353607, 8: 134217728, 9: 387420489}
runtime : 0.049445499999999976
Task exception was never retrieved
future: <Task finished coro=<asy.<locals>.fastdofn() done, defined at C:\Users\QQ\Desktop\ls\py\异步.py:9> exception=TypeError("object NoneType can't be used in 'await' expression")>
Traceback (most recent call last):
  File "C:\Users\QQ\Desktop\ls\py\异步.py", line 10, in fastdofn
    await fn(i)
TypeError: object NoneType can't be used in 'await' expression

报错了10次

很奇怪的是,hs正常打印,而且达到了预期要求。为什么还会循环报错?

报错的问题解决了,但更懵了

import asyncio
import time
hs={}
def asy():
    #asynchronous
    start=time.process_time()
    def fn(i):
        hs[i]=i**9
    async def fastdofn(i):
        fn(i)
    tasks=[asyncio.ensure_future(fastdofn(i)) for i in range(100000)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    print(hs[9])
    ti=time.process_time()-start#time interval
    print('asy runtime : {}'.format(ti))
    return ti
def syn():
    #synchronization
    start=time.process_time()
    def fn(i):
        hs[i]=i**9
    for i in range(100000):
        fn(i)
    print(hs[9])
    ti=time.process_time()-start
    print('syn runtime : {}'.format(ti))
    return ti

def main():
    l1=[]
    l2=[]
    for i in range(1,11):
        print('{}th time'.format(i))
        asy()
        syn()
        print('\n')
    #print('asy is {} times faster than syn'.format(sum(l2)/sum(l1)))
main()

异步不应该比同步快么,怎么还慢了这么多?

图片说明

  • 写回答

1条回答

  • HMMHMH 2019-11-01 17:47
    关注

    await fn(i)改为fn(i),await用于获取异步函数的回调,fn不是异步函数,所以这里会报一个错。

    评论

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题