py并发_多协程笔记
多协程
python是为数不多支持多协程开发编程语言,协程(微线程、纤程)是一种比线程要小的控制单元,其本身不受到操作系统环境的控制,全部都由开发者来进行控制,不管是进程还是线程实际上都会受到各种轮转处理的操作问题,例如:执行了一段时间之后一定要让出资源,交由其它进程或者是线程进行处理,这样的处理过程之中就一定会造成许多不必要的性能开支。
进程线程协程
程序级实现
协程(Coroutine)即协作式程序,又可以称为“微线程” 或“纤程”,所有的协程是通过线程创建的,协程与进程或线程最大的区别就是进程与线程为系统级实现,而协程为程序级实现

比较

前景
在python提供的并发编程实现之中,多协程的开发是性能最高的一种实现形式,未来实际上Python也会在多协程上进行各种发力(未来的时代也一定会逐步地迈入到协程的时代)
测试
yield实现多协程
在python中协程主要是通过程序来实现的控制,而对于协程的控制可以直接使用Python提供的yield关键字来完成,利用一些局部返回的处理操作,就可以实现多个协程的处理。
1 | |
[生产者]title = 你好、content = 你不停穿梭在城市里
【消费者】title = 你好、content = 你不停穿梭在城市里
[生产者]title = 哈喽、content = 也有无数人等着你
【消费者】title = 哈喽、content = 也有无数人等着你
[生产者]title = 你好、content = 你不停穿梭在城市里
【消费者】title = 你好、content = 你不停穿梭在城市里
[生产者]title = 哈喽、content = 也有无数人等着你
【消费者】title = 哈喽、content = 也有无数人等着你
[生产者]title = 你好、content = 你不停穿梭在城市里
【消费者】title = 你好、content = 你不停穿梭在城市里
[生产者]title = 哈喽、content = 也有无数人等着你
【消费者】title = 哈喽、content = 也有无数人等着你
[生产者]title = 你好、content = 你不停穿梭在城市里
【消费者】title = 你好、content = 你不停穿梭在城市里
[生产者]title = 哈喽、content = 也有无数人等着你
【消费者】title = 哈喽、content = 也有无数人等着你
[生产者]title = 你好、content = 你不停穿梭在城市里
【消费者】title = 你好、content = 你不停穿梭在城市里
[生产者]title = 哈喽、content = 也有无数人等着你
【消费者】title = 哈喽、content = 也有无数人等着你
进程已结束,退出代码0
greenlet实现多协程
1 | |
[生产者]title = 你好、content = 雪山的那一边会是怎么样
【消费者】title = 你好、content = 雪山的那一边会是怎么样
[生产者]title = 哈喽、content = 那里是牧场还是天堂
【消费者】title = 哈喽、content = 那里是牧场还是天堂
[生产者]title = 你好、content = 雪山的那一边会是怎么样
【消费者】title = 你好、content = 雪山的那一边会是怎么样
[生产者]title = 哈喽、content = 那里是牧场还是天堂
【消费者】title = 哈喽、content = 那里是牧场还是天堂
[生产者]title = 你好、content = 雪山的那一边会是怎么样
【消费者】title = 你好、content = 雪山的那一边会是怎么样
[生产者]title = 哈喽、content = 那里是牧场还是天堂
【消费者】title = 哈喽、content = 那里是牧场还是天堂
[生产者]title = 你好、content = 雪山的那一边会是怎么样
【消费者】title = 你好、content = 雪山的那一边会是怎么样
[生产者]title = 哈喽、content = 那里是牧场还是天堂
【消费者】title = 哈喽、content = 那里是牧场还是天堂
[生产者]title = 你好、content = 雪山的那一边会是怎么样
【消费者】title = 你好、content = 雪山的那一边会是怎么样
[生产者]title = 哈喽、content = 那里是牧场还是天堂
【消费者】title = 哈喽、content = 那里是牧场还是天堂
进程已结束,退出代码0
在整个的程序的协程切换过程之中,完全不再去关注yield以及send()函数的使用了,全部都使用greenlet进行了相关的处理包装,而这样的处理操作可以极大的简化内置的协程开发操作。
gevent简化协程开发
为了进一步简化协程的开发,在python中又提供了一个gevent第三方模块,使用greenlet进行协程操作的时候需要开发者手工进行切换处理,但是gevent可以实现自动的切换,这种自动切换一般都是需要设置一些触发条件的,例如:为了防止程序的执行过快在greenlet中可能追加延迟操作,而后再进行手工的switch()调用,但是如果使用gevent模块,里面直接提供有一个sleep()函数,这样在休眠的时候可以自动地延迟切换。
1 | |
[生产者]title = 你好、content = 天微微亮有谁在你身旁
【消费者】title = 你好、content = 天微微亮有谁在你身旁
[生产者]title = 哈喽、content = 你说你要牵我的手去流浪
【消费者】title = 哈喽、content = 你说你要牵我的手去流浪
[生产者]title = 你好、content = 天微微亮有谁在你身旁
【消费者】title = 你好、content = 天微微亮有谁在你身旁
[生产者]title = 哈喽、content = 你说你要牵我的手去流浪
【消费者】title = 哈喽、content = 你说你要牵我的手去流浪
[生产者]title = 你好、content = 天微微亮有谁在你身旁
【消费者】title = 你好、content = 天微微亮有谁在你身旁
[生产者]title = 哈喽、content = 你说你要牵我的手去流浪
【消费者】title = 哈喽、content = 你说你要牵我的手去流浪
[生产者]title = 你好、content = 天微微亮有谁在你身旁
【消费者】title = 你好、content = 天微微亮有谁在你身旁
[生产者]title = 哈喽、content = 你说你要牵我的手去流浪
【消费者】title = 哈喽、content = 你说你要牵我的手去流浪
[生产者]title = 你好、content = 天微微亮有谁在你身旁
【消费者】title = 你好、content = 天微微亮有谁在你身旁
[生产者]title = 哈喽、content = 你说你要牵我的手去流浪
【消费者】title = 哈喽、content = 你说你要牵我的手去流浪
【消费者】title = 哈喽、content = 你说你要牵我的手去流浪
……