暂无分类
暂无标签
发布于2020-04-21 15:00 阅读(402) 评论(0) 点赞(18) 收藏(5)
0
1
2
3
4
同步异步、阻塞非阻塞,都是围绕着IO展开的概念。
多线程和多进程的模型虽然解决了并发问题,但是系统切换线程的开销也很大。
另一种解决IO问题的方法是异步IO。当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。
在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,主线程只能挂起(让出CPU时间片),但异步IO模型下,主线程并没有休息,而是在消息循环中继续处理其他消息。这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。
计算机的核心是CPU,CPU运算的程序、数据只能是内存中的,因此CPU运行的时刻所需的元素都要已经在内存中,对于没有放在内存中的,需要载入(input)内存,计算完用不到的数据就需要输出(output)到磁盘上。
因为CPU计算速度远高于I/O速度,就有了I/O编程这个细分领域。
CPU一次只能运行一个进程。
在这样几个条件下,就有了I/O编程的几个方案:
同步异步的区别,就是CPU是否等待IO执行的结果。
操作IO的能力最终都是由操作系统实现的,各种语言都是把操作系统的提供的接口封装起来。
把变量从内存中编程可存储或传输的过程称之为序列化,Python中称为pickling,就是pickle
模块干的事情。
就是传统意义上的函数:
又称为微线程,纤程。
协程看上去时子程序,但执行过程中,在子程序内部可中断,转而执行别的子程序。
这里提到的中断并执行其它子程序不是函数调用。
def A():
print('1')
print('2')
print('3')
def B():
print('x')
print('y')
print('z')
# 在协程下输出结果可能是
1
2
x
y
3
z
# 关键点在于,这里并不是A调用B
不是函数调用,结果看起来像是多线程,但协程时在一个线程中执行的。
子程序就是协程的一种特例。
与多线程相比:
协程内执行多个子函数,且是在同一个线程中执行。
想要充分利用多核CPU,方法是多进程+协程。
Python对协程的支持是通过generator
实现的。
涉及generator
、next
、yeild
几个概念。
asyncio(官方文档)是Python3.4 引入的支持异步IO的标准库,采用yeild
语法;
async/await是Python3.5引入的简化代码的新语法,是Python3.3中的yield from
和Python3.4中的asyncio
结合起来产生的新语法。用于解决Python异步编程中无法有效区分yield生成器与异步的关系这个问题。
需要先补充下预备知识:
0
1
2
3
4
5
6
作者:天青色等烟雨
链接: https://www.pythonheidong.com/blog/article/336800/88f3cc09a1c2a37d48af/
来源: python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系z452as@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!