####
###
#####
结果就是1,3,2,4
####
结果就是1,3,4,2
但是在企业里不会使用这种方式,但是你要了解这种yield也可以实现协程的定义,就是两个代码块之间切换,
####
结果:1,3,2,4,
coroutine这个是协程的意思,也就是说用这个装饰器装饰过的函数,就是一个协程函数了
但是要记住这种函数就不能func() 这样来执行调用了,要用事件循环来实现
这个比上面的两个更牛逼,这是遇到io之后自动切换,而不是上面的手动切换,
假设是下载图片,假设下载图片都是2秒,也就是2秒就把两个图片都下载下来了,如果按照之前的for循环,是需要4秒的,
####
本质和上面一样的,就是把装饰器换成了async,把yield from换成了await,
###
总结:
在asyncio出现之前都是用的gevent,现在用第四种最多,中间两个都是为了理解
###
协程就是能在代码块之间切换,
协程的意义是什么?利用在一个线程中,如果遇到io等待的时间,不会傻傻的等着,会利用空闲的时间干点其他的事情,
案例:使用普通的方式下载
使用异步的方式的下载图片:
需要下载第三方模块:pip install aiohttp
同步:就是一个结束之后才会进行下一个,这个是同步编程,这个就好像是排队,
异步,就是一个没有结束,但是会执行下一个,这个就是异步方式的编程,
####
python3.7之后只需要一句就可以了,但是之前是两句,其实是等价的,就是创建了事件循环,并且把函数加入到了事件循环中,
###
###
###
####
###
这种实际代码不会这么写,只是为了理解,task,看示例2
main是一个主线程,然后里面有两个任务,
###
这种用的是最多的,
###
这种用的不多,但是你要了解,
####
future就是理解,平时不会手动创建这个future的,
###
asyncio.future和concurrent.futures这两个是不一样的,
因为有些模块是不支持协程的异步的操作的,这个时候就需要使用进程池,或者线程池的方式来进行异步操作,
以后会用到的,因为有些模块比较老,不支持协程的异步,
下面是示例:
###
####
这个异步迭代器的知识点,只是了解,不做掌握,用的很少,
####
这个还是挺有用的,涉及到这种需要打开,操作,关闭的,都是可以应用的,
####
到这里就完了,异步编程就这些内容,
注意,不支持Windows
加那两句,就是把事件循环替换成uvloop的事件循环,性能比默认的要好两倍,性能接近go,
###
####
如果是连接MongoDB呢,如果没有这个提供的现成的模块,就不能异步了吗?也是可以的,可以使用线程池或者进程池的方式,但是这种比较耗费资源,
####
luffy就是文件的名字
####
####
这个异步早就有了,不是新技术,只是Python中没有这么盛行,但是更多的框架往这个方向靠拢,比如公司要使用fastAPI,tornado,Django3,你就不了解,
这样程序员的压力就大了,你就要去学习这个,掌握这个,
#####
协程的特点在于是一个线程执行,那和多线程比,协程有何优势? 最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。 因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
###
#####