乱七八糟Nodejs系列二:线程模型
上一篇中说了这样一句话:Nodejs和浏览器javascript一样,都是单线程,所以和传统的不一样,这个后面有机会再说。挖了坑就得填,哎。
1.一个例子
来看一个例子,这个例子来自async javascript
1: function f()
2: {
3: var start = new Date();
4: setTimeout(function(){
5: var during = new Date() -start;
6: console.log(during);
7: },0)
8:
9: while(new Date() - start<1000 ){}
10: }
11: f();
问第6行中,during 会是多少?
答案是 不少于1000
这就和javascript的线程模型有关(不考虑html5的 Web Workers)
简单地说,javascript是单线程,所以执行f()的时候,setTimeout只是在事件队列中(以下简称queue)注册一个事件。f将一直运行,直到结束,然后解释器会在事件队列中找一个满足执行条件的函数(假设叫f2)执行,然后一直等到f2运行完,再到queue中去找可以运行的函数。
所以,上面的 f 函数执行完了,解释器才会去看有没有可以执行函数,虽然触发时间是0,但是执行时,时间已经至少过去1000 ms了。
还是建议大家去看看《async JavaScript》,特别是第一章。而且,这书已经有中文版了。
最后来一道面试题吧
function f()
{
setTimeout(function(){
console.log("fuck");
},0) while(true ){}
}
f();
问,控制台什么时候输出fuck。
这个就不难作答了:fuck这词是和谐词汇,控制台会屏蔽的~~
2.Nodejs
Nodejs是单线程异步执行模型,这是JavaScript这门语言的特点是一致的。
Node不适合做计算密集的程序,适合做IO密集的程序,而web服务器大多是IO密集型的。
异步方式,会一定程度打乱写程序的思路。不过已经有不少开源的库可以让我们写比较舒服的异步程序,也就是比较舒服。。
不过单线程也就意味着Node本身没有同步问题,这直接kill一个大问题。
另外对于Nodejs 在多核架构的应用,我不是很懂,因为我也是刚学习Nodejs。不过已经有一些讨论和项目了,大家可以看一下
乱七八糟Nodejs系列二:线程模型的更多相关文章
- 死磕 java线程系列之线程模型
问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...
- WPF QuickStart系列之线程模型(Thread Model)
这篇博客将介绍WPF中的线程模型. 首先我们先来看一个例子,用来计算一定范围内的素数个数. XAML: <Grid> <Grid.RowDefinitions> <Row ...
- 乱七八糟 Nodejs 系列一:试水
看Nodejs比较舒服的人,个人认为主要是: 以前是后端,转成前端的人: 前端巨牛的人: 后端巨牛的人: 巨牛的人... 当然还有我这种,脑抽不止的人~~ 不过学习的过程中发现,如果不是上来就用exp ...
- NodeJs系列二:你好,世界
安装nodejs 什么是nodejs中的模块 hello,world
- java并发系列(二)-----线程之间的协作(wait、notify、join、CountDownLatch、CyclicBarrier)
在java中,线程之间的切换是由操作系统说了算的,操作系统会给每个线程分配一个时间片,在时间片到期之后,线程让出cpu资源,由其他线程一起抢夺,那么如果开发想自己去在一定程度上(因为没办法100%控制 ...
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...
- 线程模型、pthread 系列函数 和 简单多线程服务器端程序
一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
- c# 多线程系列二 自定义线程执行器
看了第一篇文章,多线程系列,看到了在线程执行任务队列有了一定的了解~! 那么今天我来讲讲,怎么样构建通用的自定义线程概念! 线程执行任务,肯定要有目标,但是如果写死了,那么一个线程处理执行职能按照思路 ...
随机推荐
- jdbc接口api
java.sql.* 和 javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, properties): ...
- angular.forEach
if($scope.jsList.length>0){ angular.forEach($scope.jsList,function(item){ if(item._id==jsid){ jsn ...
- HDOJ(HDU) 1407 测试你是否和LTC水平一样高(暴力)
Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数 ...
- [LeetCode] 35. Search Insert Position 解决思路
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- MD中bitmap源代码分析--清除流程
bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...
- Spring中Ioc容器的注入方式
1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { ...
- 认识v$fixed_view_definition
认识v$fixed_view_definition v$fixed_view_definition 这个视图功能很强,可以将一些视图的数据来源(视图的定义)给找出来.直接举例: 1.v$sessi ...
- 爬虫学习-使用CrawlSpider
使用scrapy中的CrawlSpider类来进行爬行 一直用的是BaseSpider,回调函数的方式,有一个问题是title,date在一个页面,author,detail在另一个页面时,怎么把这些 ...
- SpringMVC拦截器(实现登录验证拦截器)
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...
- jQuery简单的Ajax调用示例
jQuery确实方便,下面做个简单的Ajax调用: 建立一个简单的html文件: <!DOCTYPE HTML> <html> <head> <script ...