协程,yield,i多路复用,复习
课程回顾:
线程池
队列:同一进程内的队列
先进先出 后进先出 优先级队列
线程池中的回调函数是谁在调用?
线程池中的回调函数是子线程调用的,和父线程没有关系
进程池中的会点函数是父进程调用的,和子进程没有关系
今日内容:
为什么要有协程?
因为想要在单线程内实现并发的效果
因为CPthon有GIL锁,限制了在同一时间点,智能执行一个线程
所以想要在执行一个线程的期间,充分的利用cpu的性能
所以才有了想在单线程内实现并发的效果
并发: 切换+保存状态
1 因为某个程序阻塞了
2 因为某个程序用完了时间片
很明显 解决1 这个问题才能提高效率
所以想要实现单线程的并发,就是解决在单线程内,多个任务函数中某个任务遇见IO操作,马上自动切换到其他任务函数去执行.
协程: 是一个比线程更加轻量级的单位,是组成线程的各个函数
携程本身没有实体
greenlet模块:能简单的实现函数与函数之间的切换,但是遇到IO操作,不能自动切换到其他函数中
(1) 注册一下函数func,将函数注册成一个对象f1
f1 = greenlet(func)
(2) 调用函数func,使用f1.switch(),如果func需要传参,就在switch这里即可
gevent模块: 可以实现在某函数内部遇到IO操作,就自动的切换到其它函数内部去执行
g = gevnent.spawn(func,参数) 注册一下函数func,返回一个对象g
gevent.join(g)#等待g指向的函数func执行完毕,如果在执行过程中,遇到IO就切换
gevent.joinall([g1 ,g2 ,g3 ])#等待g1 , g2, g3指向的函数func执行完毕
大的总结:协程使用户自己去调度的,
面试题:
已经学习过了进程,线程,协程
计算密集用多进程,可以充分利用多核cpu的性能
IO密集用多线程(注意,协程是在单线程的)
多线程和协程的区别
线程是由操作一同调度,控制
协程是由程序员自己调度,控制
IO多路复用
阻塞IO

非阻塞IO
多路复用IO
异步IO python实现不了,但是有tornado框架,天生自带异步
异步现在可以用 asyncio
面试题
select

select 和 poll 和 epoll的区别
select和poll有一个共同的机制,都时采用轮询的方式去询问内核,有没有数据准备好了
select有一个最大监听事件的限制,32位机限制1024,64位机限制2048
poll没有,理论上poll可以开启无限大,1G内存大概够你开10w个事件去监听
epoll是最好的,采用的是回调机制,解决了select和poll共同存在的问题
而且epoll理论上也可以开启无线多个监听事件
并发的本质: 切换 + 保存状态
协程,yield,i多路复用,复习的更多相关文章
- 多线程、多进程、协程、IO多路复用请求百度
最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...
- 协程与IO多路复用
IO多路复用 I/O多路复用 : 通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Python Python中有一个select模块, ...
- python第十周:进程、协程、IO多路复用
多进程(multiprocessing): 多进程的使用 multiprocessing是一个使用类似于线程模块的API支持产生进程的包. 多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧 ...
- Unity3D协程yield的理解
Unity3D的协程概括地将就是:对于一段程序,你可以加上yield标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码.协程的作用:①延迟一段时间执行代码.②等某个操作完成之后再执行 ...
- (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块
一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...
- 进程,线程,协程,io多路复用 总结
并发:要做到同时服务多个客户端,有三种技术 1. 进程并行,只能开到当前cpu个数的进程,但能用来处理计算型任务 ,开销最大 2. 如果并行不必要,那么可以考虑用线程并发,单位开销比进程小很多 线程: ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- U3D协程yield的使用和理解
部分内容参考网址:http://blog.csdn.net/huang9012/article/details/29595747 Win7+U3D 4.6.7 1.在c#中使用①首选需要定义一个返回值 ...
- Python之路,Day9 - 线程、进程、协程和IO多路复用
参考博客: 线程.进程.协程: http://www.cnblogs.com/wupeiqi/articles/5040827.html http://www.cnblogs.com/alex3714 ...
随机推荐
- SqlServer 通过日志恢复数据库
前期工作 查看数据属性,确保下条件: 1.数据库属性->选项->恢复模式=完整 2.建好库以后.一个数据库完整的数据备份 3.到出事期间日志没有你间断 4.记录出事的准确时间 一.数据准备 ...
- 用欧拉计划学习Rust编程(第13~16题)
最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...
- POI 操作 excel表格 (简单整理)
简单的整理: import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import ...
- Qt Quick 组件与动态对象
博客24## 一.Components(组件) Component 是由 Qt 框架或开发者封装好的.只暴露了必要接口的 QML 类型,可以重复利用.一个 QML 组件就像一个黑盒子,它通过属性.信号 ...
- Centos 7.5 安装JDK
#wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com ...
- 【CTS2019】珍珠(生成函数)
[CTS2019]珍珠(生成函数) 题面 LOJ 洛谷 题解 lun题可海星. 首先一个大暴力\(sb\)的\(dp\)是设\(f[i][S]\)表示当前考虑完了前\(i\)个珍珠,\(S\)集合中这 ...
- Jackson 序列化/反序列化时忽略某属性
https://www.iteye.com/blog/wwwcomy-2397340 博客分类: Spring jacksonread_onlyjsonignore 基于Spring MVC的RES ...
- SqlServer数据库分区分表实例分享(有详细代码和解释)
数据库单表数据量太大可能会导致数据库的查询速度大大下降(感觉都是千万级以上的数据表了),可以采取分区分表将大表分为小表解决(当然这只是其中一种方法),比如数据按月.按年分表,最后可以使用视图将小表重新 ...
- Jquery ajax与asp.net MVC前后端各种交互
1.Jquery通过ajaxSubmit提交表单 if (jQuery("#Edit_from").validate().form()) { jQuery("#Edit_ ...
- Java自学-I/O 中文问题
Java中的编码中文问题 步骤 1 : 编码概念 计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字. 就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号. 有的棋盘 ...