nodejs实现同步操作想法实现
Nodejs 实现 想法
2023-09-14 08:59:40 时间
众所周知,异步是得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为:func1 - func2 - func3 )也是很常见的。本文就是对这个问题记录自己的一些想法。
需要执行的函数:
var func1 = function(req,res,callback){ setTimeout(function(){ console.log(in func1); callback(req,res,1); },13000); var func2 = function(req,res,callback){ setTimeout(function(){ console.log(in func2); callback(req,res,2); },5000); var func3 = function(req,res,callback){ setTimeout(function(){ console.log(in func3); callback(req,res,3); },1000); }
可以看出在func1,func2和func3中都是用了setTimeout函数,执行的时间分别为13秒,5秒和1秒。由于nodejs异步的特性,如果使用普通的函数调用方法:
var req = null; var res = null; var callback = function(){}; func1(req,res,callback); func2(req,res,callback); func3(req,res,callback);
输出内容:
in func3 in func2 in func1
原因是因为nodejs是异步的,func2不会等func1执行完毕后再执行,而是立即执行(func3也是如此)。由于func3的运行时间最短而率先结束,func2次之,func1最后。但这明显不是我们想要的结果。怎么办?
解决办法一:callback
//深层嵌套 var req = null; var res = null; func1(req,res,function(){ func2(req,res,function(){ func3(req,res,function(){ process.exit(0); }); });
这种方法虽然能快速的解决,但暴露的问题也很明显,一是代码维护不方面,二是代码的深层嵌套看起来很不舒服。这种方法并不可取。
解决方法二:递归调用
function executeFunc(funcs,count,sum,req,res){ if(count == sum){ return ; else{ funcs[count](req,req,function(){ count++; executeFunc(funcs,count,sum,req,res); //同步调用 var req = null; var res = null; var funcs = [func1,func2,func3]; var len = funcs.length; executeFunc(funcs,0,len,req,res);
先将多个函数组成一个数组。再可以利用递归函数的特性,使程序按照一定的顺序执行。
解决方法三:调用类库
随着nodejs的发展,响应的类库也越来越多。Step和async 就是其中不错的。
1. Step的调用相对比较清爽:
Step( function thefunc1(){ func1(this); function thefunc2(finishFlag){ console.log(finishFlag); func2(this); function thefunc3(finishFlag){ console.log(finishFlag); );
2.async 的 series方法,就本例而言,它的调用方法:
var req = null; var res = null; var callback = function(){}; async.series( function(callback){ func1(req,res,callback); function(callback){ func2(req,res,callback); function(callback){ func3(req,res,callback); );
Nodejs 必知的「事件循环」 JavaScript引擎本身不实现事件循环机制。浏览器中的事件循环由浏览器实现的,NodeJS中事件循环主要是由底层Libuv库实现的。 Libuv库是事件驱动的,其封装和统一了不同平台的API实现。NodeJS的跨平台和事件循环机制都是通过Libuv库实现的。
乾坤大挪移,如何将同步阻塞(sync)三方库包转换为异步非阻塞(async)模式?Python3.10实现。 众所周知,异步并发编程可以帮助程序更好地处理阻塞操作,比如网络 IO 操作或文件 IO 操作,避免因等待这些操作完成而导致程序卡住的情况。云存储文件传输场景正好包含网络 IO 操作和文件 IO 操作,比如业内相对著名的七牛云存储,官方sdk的默认阻塞传输模式虽然差强人意,但未免有些循规蹈矩,不够锐意创新。在全球同性交友网站Github上找了一圈,也没有找到异步版本,那么本次我们来自己动手将同步阻塞版本改造为异步非阻塞版本,并上传至Python官方库。
Redis+NodeJS实现能处理海量数据的异步任务队列系统 在最近的业务中,接到了一个需要处理约十万条数据的需求。这些数据都以字符串的形式给到,并且处理它们的步骤是异步且耗时的(平均处理一条数据需要 25s 的时间)。如果以串行的方式实现,其耗时是相当长的: 总耗时时间 = 数据量 × 单条数据处理时间 T = N * t (N = 100,000; t = 25s) 总耗时时间 = 2,500,000 秒 ≈ 695 小时 ≈ 29 天 显然,我们不能简单地把数据一条一条地处理。那么有没有办法能够减少处理的时间呢?经过调研后发现,使用异步任务队列是个不错的办法。
相关文章
- nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
- 【nodejs原理&源码赏析(5)】net模块与通讯的实现
- nodejs 在windows10中设置动态(视频)壁纸
- nodejs实现同步操作想法实现
- 用nodejs实现一个简单的聊天室
- yum安装最新版nodejs
- Docker多阶段镜像构建Dockerfile脚本示例:构建nodejs前端项目
- 架构选型之Nodejs与Java
- 单步调试理解webpack里通过require加载nodejs原生模块实现原理
- ABAP,Java, nodejs和go语言的web server编程
- 推荐一个一分钟就可以搭建好的静态文件服务器,基于nodejs
- Atitit nodejs db api// 加载 mysql modulevar sys = require(“sys“);var mysql = require(“mysql“);va
- Atitit 提升开发效率 简化设计工具箱 vs 问题诊断 目录 1. 语言类类tool内嵌脚本解释器1 1.1. 脚本语言 php nodejs python1 1.2. Sql1 2. D
- nodejs 从TCP套接字读取并解析数据
- nodejs debugging
- Nodejs测试:从0到90(实践篇)
- NodeJs——(16)用Nodejs 4.X版本,制作一个微博网站(多图,详细步骤)
- 【nodejs原理&源码赏析(1)】Express中间件系统的基本实现
- 【Eclipse高速发展-文章插件】google V8,对于调试Nodejs