单线程

单线程+多任务异步协程

喜欢而已 提交于 2020-01-16 16:15:02
1.基础概念 1.协程   - 在函数(特殊的函数)定义的时候,如果使用了async修饰的话,则改变函数调用后返回一个协程对象,并且函数内部的实现语句不会被立即执行。 2.任务对象   - 任务对象就是对协程对象的进一步封装,任务对象==高级的协程对象==特殊的函数   - 任务对象必须要注册到事件循环对象中   - 给任务对象绑定回调函数:爬虫的数据解析中 3.事件循环   - 当作是一个容器,容器中必须存放任务对象   - 当启动事件循环对象后,则事件循环对象会对其内部存储任务对象进行一步的执行 4.aiohttp    - 支持异步网络请求的模块 协程 import asyncio def callback(task): # 作为任务对象的回调函数 print('i am callback and ', task.result()) # task.result是用来接收特殊函数的返回值 async def test(): print("i am test") return "123" c = test() # 封装了一个任务对象 task = asyncio.ensure_future(c) task.add_done_callback(callback) # 创建一个事件循环的对象 loop = asyncio.get_event_loop() loop.run_until

同步,异步 阻塞,非阻塞, 异步+回调机制 线程队列 事件Event 丶协程

大兔子大兔子 提交于 2020-01-11 16:08:59
day36 一丶同步,异步 同步: 所谓同步就是一个任务需要依赖另一个任务时,只有被依赖任务执行完毕之后,依赖的任务才会完成.这是可靠的任务序列.要么都成功,要么失败,两个任务的状态可以保持一致. 异步: 所谓异步不需要等待被依赖的任务完成,只是通知依赖的任务要完成什么工作.依赖的任务也立即执行,只要自己完成了整个任务就算完成了. 至于被依赖的任务是否完成,依赖它的任务无法确定,是不可靠的任务序列 ### 同步和异步## 比如我去银行办理业务,可能会有两种方式:# 第一种 :选择排队等候;# 第二种 :选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;​# 第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;​# 第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。 二丶阻塞,非阻塞, 阻塞和非阻塞两个概念与程序(也就是执行程序的'线程')等待消息通知时的状态相关 阻塞: 在程序中,阻塞代表程序'卡'在某处,必须等待这处执行完毕才能继续执行. 通常的阻塞大多数是IO阻塞 比如:银行排队取钱是一条流水线

案例_(单线程)使用正则的内涵段子爬虫

為{幸葍}努か 提交于 2020-01-11 05:03:51
(单线程)使用正则的内涵段子爬虫 代码如下 1 from urllib.request import * 2 import re 3 import time 4 5 6 class Spider(object): 7 def __init__(self): 8 self.__start_page = int(input("请输入要爬取的开始页面:")) 9 self.__end_page = int(input("请输入要爬取的结束页面:")) 10 11 # 模拟浏览器代理 12 self.__header = { 13 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3514.0 Safari/537.36"} 14 15 # 用来记录帖子数量 16 self.num = 1 17 18 def __load_page(self, start_page, end_page): 19 """ 20 下载页面 21 """ 22 print("正在爬取中....") 23 for page in range(self.__start_page, self.__end_page + 1): 24 # 由于第一页是url比较特殊

网络编程进阶:并发编程之协程、IO模型

三世轮回 提交于 2020-01-10 06:56:57
协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发; 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制),一种情况是该任务发生了阻塞,另一种是该任务计算的时间过长或有一个优先级更高的程序替代了它 在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 如果多个任务都是纯计算的,上图的情况2并不能提升效率,因为只是让CPU来回切,这样看起来所有任务都被“同时”执行的效果,此时这种切换反而会降低效率; yield本身就是一种在单线程下可以保存任务运行状态的方法,其特点如下:   1. yield可以保存状态,yield的状态保存于操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级   2. send可以把一个函数的结果传递给另外一个函数,以此实现单线程内程序之间的切换;yield并不能实现遇到io切换 在任务1遇到io情况下,切到另外一个任务去执行,这样就可以利用任务1阻塞的时间完成其他任务的计算,效率的提升就在此处 对于单线程下,我们不可避免程序中出现io操作,如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另一个任务去计算

C#定时器

谁都会走 提交于 2020-01-09 21:56:00
1、C# 定时器的使用 System.Windows.Forms.Timer,System.Timers.Timer,System.Threading.Timer - 从_零_开始的专栏 - CSDN博客.html( https://blog.csdn.net/m1654399928/article/details/21713311 )   ZC:查了几个帖子,都没说 几个定时器的区别(哪个是单线程,哪个是多线程 机制),就这个帖子 提到了,先记录一下 2、 3、 4、 5、 来源: https://www.cnblogs.com/csskill/p/11195940.html

同步、异步、多线程

雨燕双飞 提交于 2020-01-09 18:35:07
关于Web开发里并发、同步、异步以及事件驱动编程的相关技术 1、异步、多线程、并行 异步、多线程、并行不是同一个概念 线程:是 进程 中某个单一顺序的 控制流 。 并行:是同一时刻有多条指令同时被执行, 异步:是让CPU暂时搁置当前请求的响应,处理下一个请求,当通过轮询或其他方式得到回调通知后,开始运行。 多线程将异步操作放入另一线程中运行,通过轮询或回调方法得到完成通知,但是完成端口, 由操作系统接管异步操作的调度,通过硬件中断,在完成时触发回调方法,此方式不需要占用额外线程。 异步最终的目的就是给我们带来更高效的时间效应,它是一种结果,而实现这个异步的可能是异步委托,线程池,线程等等,只不过是一种方法或途径罢了。 2、并行、并发 并行(parallelise)同时刻(某点),并发(concurrency)同时间(某段) 3、互斥、同步 互斥:进程间相互排斥使用临界资源;比如写操作; 同步:不是排斥关系而是依赖关系,前一个进程的输出是后一个进程的输入,当第一个进程没有结束时第二个进程必须等待,相互协同完成一些事情;具有同步关系的一组进程并发时发送的消息称为消息或者事件; 摘自: 并行和并发、同步和异步的区别 4、iOS之GCD iOS多线程--彻底学会多线程之『GCD』 并行队列+异步执行 串行队列+同步执行 并行队列+同步执行 串行队列+异步执行 5、其他 原文: 同步、异步

Redis 单线程却能支撑高并发 - 简书 https://www.jianshu.com/p/2d293482f272

时间秒杀一切 提交于 2020-01-09 18:14:33
小结: 1、 在 I/O 多路复用模型中,最重要的函数调用就是 select,该方法的能够同时监控多个文件描述符的可读可写情况; 2、 Redis 服务采用 Reactor 的方式来实现文件事件处理器(每一个网络连接其实都对应一个文件描述符); 3、 虽然整个文件事件处理器是在单线程上运行的,但是通过 I/O 多路复用模块的引入,实现了同时对多个 FD 读写的监控,提高了网络通信模型的性能,同时也可以保证整个 Redis 服务实现的简单 4、 Redis 会优先选择时间复杂度为 O(1) 的 I/O 多路复用函数作为底层实现,包括 Solaries 10 中的 evport、Linux 中的 epoll 和 macOS/FreeBSD 中的 kqueue,上述的这些函数都使用了内核内部的结构,并且能够服务几十万的文件描述符。 但是如果当前编译环境没有上述函数,就会选择 select 作为备选方案,由于其在使用时会扫描全部监听的描述符,所以其时间复杂度较差 O(n),并且只能同时服务 1024 个文件描述符,所以一般并不会以 select 作为第一方案使用。 https://mp.weixin.qq.com/s/ySG2Qtitr6b8Zcb-SAMnGQ Redis 和 I/O 多路复用 https://draveness.me/redis-io-multiplexing

一种手游中实时战斗系统的设计思路

﹥>﹥吖頭↗ 提交于 2020-01-07 16:42:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ‍ ‍ 引言 ‍ ‍ 现在的手游玩法越来越复杂,特别是战斗系统,再也不是以前那种简单的回合制模式。越来越多的手游采用了实时战斗的模式(如刀塔传奇),玩法有点类似于以前的即时战略游戏,这对于程序设计提出了更高的要求。本文提出了一种手游中实时战斗系统可行的设计思路。 设计需求 实时战斗,不同于早期页游和手游单纯的看战报或回合制模式,整个战斗过程是流畅和连贯的,人物的移动、攻击、技能释放都不会让玩家感觉到停滞,整体感觉类似于传统的即时战略游戏(魔兽、星际等),玩家在游戏中的指令(如释放技能)可以实时得到执行。 这里带来的问题是,如何设计一个稳定且高效的战斗系统,来满足多人战斗时可能的高并发;不会因为高并发对服务器造成过重的负担,不会对玩家带来糟糕的延时体验;同时数目繁多的兵种和技能要能够稳定有序地工作在这个系统中,不会让程序员疲于应付而无所适从。 下面针对这些需求提出了一种设计思路。 设计要点 : 内存化 当玩家在线人数很多时,如果还是将每次数据修改入库,势必会带来很大的cpu开销。笔者曾经参与一个项目,当同时在线人数达到500时,服务器用于mysql的cpu占用率飙到了800%。后来经过分析,有很大一部分数据没必要实时入库,例如战场上的NPC数据,相对不敏感,即使服务器重启也无所谓,这部分数据可以全走内存

浅谈js运行机制(线程)

扶醉桌前 提交于 2020-01-05 00:29:37
浅谈js运行机制(线程) 1.前言 从开始接触js时,我们便知道js是单线程的。单线程,异步,同步,互调,阻塞等。在实际写js的时候,我们都会用到ajax,不管是原生的实现,还是借助jQuery等工具库实现,我们都知道,ajax可以实现局部刷新,并且在请求处理时,任然可以响应用户的操作,比如点击事件。不是说js是单线程吗?这些都是怎么实现的? 在阅读《深入理解Bootrap的源码》一书,在分析轮播组件(carousel.js)的源码时,作者对一句代码操作的注释引起了我的兴趣。 setTimeout(function(){ that.$element.trigger('slid'); },0);//触发slid事件,这里使用setTimeout是为了确保UI刷新线程不被阻塞。 1 2 3 4 后面我会一一解答这些疑惑。 2.浏览器线程 js运作在浏览器中,是单线程的,即js代码始终在一个线程上执行,这个线程称为js引擎线程。 浏览器是多线程的,除了js引擎线程,它还有: UI渲染线程 浏览器事件触发线程 http请求线程 EventLoop轮询的处理线程 …….. 这些线程的作用: UI线程用于渲染页面 js线程用于执行js任务 浏览器事件触发线程用于控制交互,响应用户 http线程用于处理请求,ajax是委托给浏览器新开一个http线程 EventLoop处理线程用于轮询消息队列

浅谈js运行机制(线程)

与世无争的帅哥 提交于 2020-01-05 00:21:43
浅谈js运行机制(线程) 1.前言 从开始接触js时,我们便知道js是单线程的。单线程,异步,同步,互调,阻塞等。在实际写js的时候,我们都会用到ajax,不管是原生的实现,还是借助jQuery等工具库实现,我们都知道,ajax可以实现局部刷新,并且在请求处理时,任然可以响应用户的操作,比如点击事件。不是说js是单线程吗?这些都是怎么实现的? 在阅读《深入理解Bootrap的源码》一书,在分析轮播组件(carousel.js)的源码时,作者对一句代码操作的注释引起了我的兴趣。 setTimeout(function(){ that.$element.trigger('slid'); },0);//触发slid事件,这里使用setTimeout是为了确保UI刷新线程不被阻塞。 1 2 3 4 后面我会一一解答这些疑惑。 2.浏览器线程 js运作在浏览器中,是单线程的,即js代码始终在一个线程上执行,这个线程称为js引擎线程。 浏览器是多线程的,除了js引擎线程,它还有: UI渲染线程 浏览器事件触发线程 http请求线程 EventLoop轮询的处理线程 …….. 这些线程的作用: UI线程用于渲染页面 js线程用于执行js任务 浏览器事件触发线程用于控制交互,响应用户 http线程用于处理请求,ajax是委托给浏览器新开一个http线程 EventLoop处理线程用于轮询消息队列