求解, python3.5 的 asyncio 库, async/await 的一些疑惑

求解, python3.5 的 asyncio 库, async/await 的一些疑惑,第1张

求解, python3.5 的 asyncio 库, async/await 的一些疑惑,第2张

async/await 这个协程 异步为什么对磁盘 io 无效?

import asyncio
async def wr1(): # f = open('text1.txt','w') # for x in range(1,39999999): # f.write('12345ddd') # f.close()

f = open('text3.txt','r')
print(f.read())
f.close()

async def wr2(): # f = open('text2.txt','w') # for x in range(1,79999999): # f.write('23456fff') # f.close()

for x in range(1,519999):
	print('xx')

async def wr3(): # f = open('text3.txt','w') # for x in range(1,99999999): # f.write('34567ggg') # f.close()

for x in range(1,919999):
	print('yy')

def demo4():

async def washing1():
    await wr1()

async def washing2():
    await wr2()

async def washing3():
    await wr3()


# 1. 创建一个事件循环
loop = asyncio.get_event_loop()

# 2. 将异步函数加入事件队列
tasks = [
    washing1(),
    washing2(),
    washing3(),
]

# 3. 执行事件队列, 直到最晚的一个事件被处理完毕后结束
loop.run_until_complete(asyncio.wait(tasks))


# 4. 如果不再使用 loop, 建议养成良好关闭的习惯
loop.close()

if name == 'main': start = time()

 demo4()  

end = time()
print('elapsed time = ' + str(end - start))

第一段是读取磁盘,第二第三段是打印。按道理遇到 io,dma 交出总线,cpu 就空运转直到有数据才工作,所以 wr1 应该和 2 或 3 一块执行才对的,而实际情况不是这样的,是跟单线程同步执行一样的所需时间

----------------------- 以下是精选回复-----------------------

答:washing1(),washing2(),washing3()不要 await wr1(),wr2(), wr3()这么搞,这样本来就和同步一样了
答:首先你得明白协程的概念,不是加个 async 修饰就能叫异步函数的。如果使用了 asyncio,那 io 以及 sleep 等操作,就要使用 asyncio 包内的封装函数。或者使用 executor 。
你的代码里 open 操作卡死整个线程,导致没法 yield 到其他协程,所以只能顺序执行。
答:不是你说他是协程它就是协程的,它得是协程它才是一个协程.
https://github.com/Tinche/aiofiles
答:在异步函数里面调用同步函数还是会阻塞的啊,你得用异步的文件接口。官方库里面没有,得用线程池,或者你自己造。
答:这就是 Python 这些语言半路出家搞协程的缺点

底层很多东西没有异步,不是简单加个 async 关键字就解决问题了

其实目前绝大部分异步方案都无法做到文件 IO 的异步,都是线程池去模拟的
答:可以看看这个 https://github.com/Tinche/aiofiles/
答:需要选择支持异步功能的 io 库
答:网络 io 有原生协程,文件 io 要要协程只能用线程包起来,没法原生异步。
答:这时候就得拿出这个了 https://hatboy.github.io/2019/02/16/Python%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E8%AF%A6%E8%A7%A3/
答:没学会走就开始跑就这结果了

正正经经的把异步编程写几次,什么 select,epoll 多线程都好好用过几次再来折腾协程吧

别堕落到低端 php 程序员的水准好么
答:async/await 本质上是对 IO 复用机制的封装,系统提供的 IO 复用不能完成的事情,async/await 也不能实现。比如你想用底层是 epoll 实现的 eventloop 去处理文件 IO 那是不行的,要不就是模拟。
去读《 Unix 网络编程》吧,回来就会更好地理解这些语法
答:python 的异步不完备吧,现在没必要在上面浪费时间
答:官方 group 有讨论过这个问题,由于底层系统不支持,现在的异步本地 io 都是多线程包装的,实际的提升很小,所以 asycio 才没有做这个
答:--- async/await 这个协程 异步为什么对磁盘 io 无效?

可以看看官网文档,明确说了对磁盘 IO 不支持,他们推荐 `loop.run_in_executor`
答:因为 python 的协程本质上是借助 IO 多路复用来实现异步的,磁盘 IO 没有相应的机制和接口
答:python 的协程就是搞笑的,别花太多心思,底层大部分不支持。比如网络 io,你用 socket 弄到死都不能异步,你得用
asyncio.open_connection(host,22),
答:为啥宁愿发帖都不看看官方文档...
https://github.com/python/asyncio/wiki/ThirdParty#filesystem
我一个不搞 python 都能找到答案...
答:这需要库专门支持,比如 requests 不行得用 aiohttp
不像多线程,直接往里面放就行了,多线程该阻塞的还是阻塞,只不过不在一个线程
协程是阻塞的时候直接转向 loop 里的下一个任务,所以这里面就有一个操作,就是告诉系统你待会儿来找我,
普通的库并没有这个操作,只会让你等着
就像买东西,有些人你能打个招呼,待会等做完了来取东西,有些只能等着不能走

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 求解, python3.5 的 asyncio 库, async/await 的一些疑惑

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情