单线程

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

大城市里の小女人 提交于 2019-12-02 03:23:12
前言 这段时间自己在看一些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 =

常见线程池

荒凉一梦 提交于 2019-12-01 23:20:27
import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 public class TestThreadPoolExecutor { 7 public static void main(String[] args) { 8 //创建一个单线程化的线程池 9 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 10 for (int i = 0; i < 10; i++) { 11 final int index = i; 12 singleThreadExecutor.execute(new Runnable() { 13 public void run() { 14 try { 15 //结果依次输出,相当于顺序执行各个任务 16 System.out.println(Thread.currentThread().getName()+"正在被执行,打印的值是:"+index); 17 Thread.sleep(1000); 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21

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

扶醉桌前 提交于 2019-12-01 22:28:14
前言 这段时间自己在看一些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 =

单线程多任务异步协程

孤街浪徒 提交于 2019-12-01 22:18:49
目录   1. 概念讲解   2. 多任务异步协程理解   3.基于aiohttp模块异步网络请求实现数据爬取及数据解析 一、需要了解的概念    特殊函数 :如果async修饰了一个函数的定义,那么该函数就变成了一个特殊函数,      特殊之处 :特殊函数被调用后函数内部实现语句不会被立即执行      该函数调用之后会返回一个协程对象       协程对象 :特殊函数调用后可以返回一个协程对象     协程 == 特殊函数    任务对象 :对协程对象的进一步封装,就是一个高级协程对象     任务对象 == 协程对象 == 特殊的函数      绑定回调 :task.add_done_callback(parse) #parse就是一个回调函数       parse的定义:         parse必须又一个参数,该参数表示的就是回调函数对应的任务对象         task.result(): 就是特殊函数的的返回值    事件循环对象 :可以让特殊函数内部的语句执行     该对象内部必须注册的是任务对象,当事件循环开启后其内部注册的任务对象就可以基于异步被执行   ps: 在特殊函数每部不可以出现不支持异步代码对应的模块 定义如下: import asyncio import time urls = [ 'http://127.0.0.1:5000/jay',

JavaScript可否多线程? 深入理解JavaScript定时机制

杀马特。学长 韩版系。学妹 提交于 2019-12-01 18:01:05
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了. 同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑! 但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解: div.onclick = function(){ setTimeout( function(){document.getElementById(’inputField’).focus();}, 0); }; 既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇. 直到最后某一天 , 你不小心写了一段糟糕的代码: setTimeout( function(){ while(true){} } ,

Javascript是单线程的深入分析

半腔热情 提交于 2019-12-01 18:00:50
面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚。来深入分析一下: 首先看下面的代码: 1 2 3 4 5 6 7 8 9 function foo() { console.log('first' ); setTimeout( (function(){ console.log('second' ); } ), 5); } for (var i = 0; i < 1000000; i++) { foo(); } 执行结果会首先全部输出first,然后全部输出second;尽管中间的执行会超过5ms。为什么? Javascript是单线程的 因为 JS运行在浏览器中,是单线程的,每个window一个JS线程 ,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。而浏览器是 事件驱动的(Event driven) ,浏览器中很多行为是 异步(Asynchronized) 的,会创建事件并放入执行队列中。javascript引擎是单线程处理它的任务队列, 你可以理解成就是普通函数和回调函数构成的队列。当异步事件发生时,如mouse click, a timer firing, or an

JavaScript可否多线程? 深入理解JavaScript定时机制

百般思念 提交于 2019-12-01 18:00:35
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了. 同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑! 但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解: div.onclick = function(){ setTimeout( function(){document.getElementById(’inputField’).focus();}, 0); }; 既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇. 直到最后某一天 , 你不小心写了一段糟糕的代码: setTimeout( function(){ while(true){} } ,

爬虫4:单线程+多任务的异步协程,selenium的基本使用,基于js加密和混淆的案列

谁都会走 提交于 2019-12-01 08:40:44
1.单线程+多任务的异步协程 特殊函数: 如果一个函数的定义被asyncio修饰后,则该函数就成了一个特殊的函数。 协程: 就是一个协程对象。特殊函数调用的返回就是协程对象。 特殊函数被调用后,函数内部的实现语句不会被立即执行,然后该函数调用就会返回一个协程对象。 特殊函数的调用的返回 == 协程对象。 任务对象(只是在爬虫里面才会有任务对象): 其实就是对协程对象的进一步封装。 结论: 任务对象,就是一个高级的协程对象 任务对象 == 高级的协程对象 == 特殊函数调用的返回 为什么要使用任务对象? 因为任务对象可以绑定回调函数,协程对象和特殊的函数都没有回调函数 事件循环对象:是整个异步中的重要操作,没有它就实现不了异步 作用:将其内部注册的任务对象进行异步执行。  使用单线程+多任务的异步协程的编码流程    1.定义特殊函数    2.创建协程对象    3.封装任务对象    4.创建事物循环对象    5.将任务对象注册到事物循环对象并且开启循环对象 2.代码实现 import asyncio import time from time import sleep start = time.time() # 函数调用 async def get_request(url): # 加上async之后,在调用特殊函数的时候,里面的代码不会被执行,但是会返回一个coroutine

3-1 协程介绍

送分小仙女□ 提交于 2019-12-01 06:48:58
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: 1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 单纯地切换反而会降低运行效率 #串行执行 import time def consumer(res): '''任务1:接收数据,处理数据''' pass def producer(): '''任务2:生产数据''' res=[] for i in range(10000000):

线程、进程和js单线程

五迷三道 提交于 2019-12-01 02:51:41
先看一个比喻 进程就是一个公司,每个公司都有自己的资源可以调度;公司之间是相互独立的;而线程就是公司中的每个员工(你,我,他),多个员工一起合作,完成任务,公司可以有一名员工或多个,员工之间共享公司的空间 什么是进程? 进程:是cpu分配资源的最小单位;(是能拥有资源和独立运行的最小单位) 什么是线程? 线程:是cpu调度的最小单位;(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程) 浏览器是多进程的 放在浏览器中,每打开一个tab页面,其实就是新开了一个进程,在这个进程中,还有ui渲染线程,js引擎线程,http请求线程等。 所以,浏览器是一个多进程的。 大家都在说js是单线程的,但是为什么要设计成单线程? 这主要和js的用途有关,js是作为浏览器的脚本语言,主要是实现用户与浏览器的交互,以及操作dom;这决定了它只能是单线程,否则会带来很复杂的同步问题。 举个例子:如果js被设计了多线程,如果有一个线程要修改一个dom元素,另一个线程要删除这个dom元素,此时浏览器就会一脸茫然,不知所措。所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以