Python教程

python&协程&asyncio&异步

本文主要是介绍python&协程&asyncio&异步,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

####

协程:

###

 

 #####

 

结果就是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

 

 

同步:就是一个结束之后才会进行下一个,这个是同步编程,这个就好像是排队,

异步,就是一个没有结束,但是会执行下一个,这个就是异步方式的编程,

3,异步编程

 

####

 

 python3.7之后只需要一句就可以了,但是之前是两句,其实是等价的,就是创建了事件循环,并且把函数加入到了事件循环中,

###

 

 ###

 

###

 

 ####

 

 

 

 ###

 

这种实际代码不会这么写,只是为了理解,task,看示例2

main是一个主线程,然后里面有两个任务,

###

 

 这种用的是最多的,

 

 

###

 

这种用的不多,但是你要了解,

####

 

 

future就是理解,平时不会手动创建这个future的,

###

 

 asyncio.future和concurrent.futures这两个是不一样的,

因为有些模块是不支持协程的异步的操作的,这个时候就需要使用进程池,或者线程池的方式来进行异步操作,

以后会用到的,因为有些模块比较老,不支持协程的异步,

下面是示例:

 

 ###

 

 ####

 

 

 

这个异步迭代器的知识点,只是了解,不做掌握,用的很少,

####

 

 这个还是挺有用的,涉及到这种需要打开,操作,关闭的,都是可以应用的,

####

到这里就完了,异步编程就这些内容,

 

注意,不支持Windows

加那两句,就是把事件循环替换成uvloop的事件循环,性能比默认的要好两倍,性能接近go,

###

实战案例:

 

 

 

 

 ####

 

 

 

如果是连接MongoDB呢,如果没有这个提供的现成的模块,就不能异步了吗?也是可以的,可以使用线程池或者进程池的方式,但是这种比较耗费资源, 

####

 

 

 

luffy就是文件的名字

 

####

 

 

 ####

 

这个异步早就有了,不是新技术,只是Python中没有这么盛行,但是更多的框架往这个方向靠拢,比如公司要使用fastAPI,tornado,Django3,你就不了解,

这样程序员的压力就大了,你就要去学习这个,掌握这个,

#####

协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

###

 

 

 

 

 

#####

这篇关于python&协程&asyncio&异步的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!