单线程

多线程与单线程

匿名 (未验证) 提交于 2019-12-03 00:34:01
单线程也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的才会执行到。 多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群发email的多线程软件,由于 操作一次需要网络的返回信息 花的时间比较长 ,而对cpu来说却是空闲的,如果是一个一个顺序执行,那么搜索几千个IP就会花上好久好久。而如果用多线程就可以在等待期间加入其他的搜索,然后等待,这样可以提高效率。不过多线程和多进程公用一些资源时要考虑的问题好像也是一样的,,对于一些公共资源或者公共变量的访问和修改时要注意特别的,需要一些锁定什么的,还有顺序问题的考虑。 多线程编程的目的,就是 "最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。 也就是说当CPU资源已经被用得差不多了,再增加线程也无济于事么。 实例: 单线程,多线程的一个应用实例: 单线程的思路是遍历所有文件,当遍历到文件是 .java的时候,查找这个文件的内容,查找完毕之后,再遍历下一个文件 现在通过多线程调整这个思路: 遍历所有文件,当遍历到文件是.java的时候,创建一个线程去查找这个文件的内容,不必等待这个线程结束,继续遍历下一个文件 先看单线程: package Stream;

异步I/O

匿名 (未验证) 提交于 2019-12-03 00:11:01
1.文件操作 2.网络操作 1.定时任务 2.事件处理 3.Ajax回调处理 引入事件队列机制 Node.js中的事件模型与浏览器中的事件模型类似 单线程+事件队列(JS的运行是单线程的,但是Node.js的环境和浏览器的环境是多线程的) Node.js中异步执行的任务: 1.文件I/O 2.网络I/O Node.js是基于回调函数的编码风格 来源:博客园 作者: 浮华夕颜 链接:https://www.cnblogs.com/zcy9838/p/11590087.html

JS异步和单线程

匿名 (未验证) 提交于 2019-12-02 23:38:02
一题目: a:同步和异步的区别?分别举一个同步和异步的例子 b:一个关于setTimeout的笔试题 c:前端使用异步的场景有哪些? 大家可以先想想,能否完全理解。 首先咱们先看一个例子,直接上代码 1 console.log(100) 2 setTimeout(function(){ 3 console.log(200) 4 },1000) 5 console.log(300) 个人理解:如果大家不知道setTimeout的用法。该段代码先打印100,然后等待1秒打印200,最后再打印300。这是人的思维而不是浏览器的思维,这个逻辑显然不对 正确的逻辑是: 打印100,打印300,1秒后打印200 接下来再来看看同步的例子: 1 console.log(100) 2 alert(333) 3 console.log(300) 二何时需要异步 1.在可能发生等待的情况 2.等待过程中不能像alert一样阻塞程序运行 3.因此,所有的“等待的情况”都需要异步 三前端使用异步的场景 1.定时任务:setTimeout,setInverval 2.网络请求:ajax请求,动态img加载 3.事件绑定 1 console.log('start') 2 document.getElementById('kw').addEventListener('click',function(){ 3

铁乐学python_Day43_协程

匿名 (未验证) 提交于 2019-12-02 22:51:30
铁乐学python_Day43_协程 之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。 但是我们知道无论是创建多进程还是创建多线程来解决问题, 都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。 随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题, 即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。 这样就可以节省创建线进程所消耗的时间。 为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制), 一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长。 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态。 运行、阻塞、就绪。 1、进程在运行状态下遇到io之类等待输入而进入阻塞状态; 2、调度程序选择另一个就绪状态中的进程; 3、调度程序选择就绪的进程转到运行状态; 4、之前阻塞状态下的进程出现有效输入后切换到就绪状态,而不能马上进入运行状态。 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果, 如果多个任务都是纯计算的

在爬虫中使用单线程异步协程,包含单任务和多任务,以及数据解析使用回调函数

混江龙づ霸主 提交于 2019-12-02 19:56:47
aiohttp 简介 aiohttp 可以实现单线程并发IO操作,用他来代替非异步模块request来发送请求,请求中的ua,headers,和参数都可以添加,添加方法如下: 环境安装 pip install aiohttp aiohttp使用 1.发起请求 async def fetch(): async with aiohttp.ClientSession() as session: async with session.get('https://www.baidu.com') as resposne: print(await resposne.text()) loop = asyncio.get_event_loop() tasks = [fetch(),] loop.run_until_complete(asyncio.wait(tasks)) 2.添加请求参数的方法: params = {'key': 'value', 'page': 10} async def fetch(): async with aiohttp.ClientSession() as session: async with session.get('https://www.baidu.com/s',params=params) as resposne: print(await resposne.url

从实践角度重新理解BIO和NIO

北城以北 提交于 2019-12-02 18:06:53
前言 这段时间自己在看一些Java中BIO和NIO之类的东西,看了很多博客,发现各种关于NIO的概念说的天花乱坠头头是道,可以说是非常的完整,但是整个看下来之后,自己对NIO还是一知半解的状态,所以这篇文章不会提到很多的概念,而是站在一个实践的角度,写一些我自己关于NIO的见解,站在实践过后的高度下再回去看概念,应该对概念会有一个更好的理解。 实现一个简易单线程服务器 要讲明白BIO和NIO,首先我们应该自己实现一个简易的服务器,不用太复杂,单线程即可。 为什么使用单线程作为演示 因为在单线程环境下可以很好地对比出BIO和NIO的一个区别,当然我也会演示在实际环境中BIO的所谓一个请求对应一个线程的状况。 服务端 public class Server { public static void main(String[] args) { byte[] buffer = new byte[1024]; try { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务器已启动并监听8080端口"); while (true) { System.out.println(); System.out.println("服务器正在等待连接..."); Socket socket =

js单线程的本质-------Event Loop

偶尔善良 提交于 2019-12-02 17:00:32
怎么判断是浏览器还是node环境? node中window是未定义;setImmediate是定义的,在浏览器中未定义 timer阶段:这个阶段会执行setTimeout和setInterval check阶段:执行setImmediate macro task [task] 宏任务 :script(页面代码)、setTimeout、setInterval、I/O事件、UI交互事件(点击事件) micro task [job]  微任务: Promise、process.nextTick、Promise().then() 宏任务可以有多个队列 微任务只有一个队列 setTimeout任务之间,推迟执行的毫秒数越小,排在队列里面越靠前 在node里面,timers(setTimeout、setInterval)会优先于setImmediate setTimeout(() => { console.log('setTimeout') },0); // 大于1000时,会先执行setImmediate setImmediate(()=> { console.log('setImmediate')})    console.log('start'); setTimeout(function (){ console.log('timeout'); },10); new Promise(

js单线程和setTimeout的

安稳与你 提交于 2019-12-02 15:34:36
面试的时候遇到的几个问题 1. js单线程的 while(true) { setTimeout(() => { console.log('1') }, 0) } 没打上来,确实很简单,一开始看不出来是考察单线程的,因为js引擎一次处理一个线程,setTimeout线程放到线程队列里边,先执行while,但是因为死循环,所以无法打印。 2. 问到了数据库索引,有哪些类型的索引,树的索引有什么好处 索引有树、哈希,其他待补充 来源: https://blog.csdn.net/david___/article/details/102779608

为什么Redis是单线程?

孤人 提交于 2019-12-02 10:45:49
转载链接: https://cloud.tencent.com/developer/article/1120615 1)以前一直有个误区,以为:高性能服务器 一定是多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高,其实不然! 在说这个事前希望大家都能对 CPU 、 内存 、 硬盘的速度都有了解了,这样可能理解得更深刻一点,不了解的朋友点:CPU到底比内存跟硬盘快多少 2)redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案 —— 阿里 沈询 因为一次CPU上下文的切换大概在 1500ns 左右。 从内存中读取 1MB 的连续数据,耗时大约为 250us,假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换, 那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了

redis 单线程的理解

故事扮演 提交于 2019-12-02 06:08:36
1. redis单线程问题   单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。 2. 为什么说redis能够快速执行 (1) 绝大部分请求是纯粹的内存操作(非常快速) (2) 采用单线程,避免了不必要的上下文切换和竞争条件 (3) 非阻塞IO - IO多路复用 3. redis的内部实现   内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。 4. Redis关于线程安全问题    redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。 另一篇对redis单线程的理解: Redis单线程理解 个人理解 redis分客户端和服务端,一次完整的redis请求事件有多个阶段(客户端到服务器的网络连接-->redis读写事件发生--> redis服务端的数据处理(单线程) -->数据返回)。平时所说的redis单线程模型