当前位置: 首页 > 后端技术 > Node.js

nodethread.sleep的实现

时间:2023-04-03 15:32:19 Node.js

最近在写一些奇怪的东西的时候,发现go或者其他语言实现的并发任务都是使用thread.sleep来挂起主进程的。回过头来看,我复制粘贴到node上一直循环是不合适的。我也需要暂停!该怎么办??挠了挠头,去npm找相关的包,发现了一个叫thread-sleep的包,下载量还挺大的。怀着好奇的心情看了下源码,发现源码相当讨厌'usestrict';varchildProcess=require('child_process');varnodeBin=process.argv[0];module.exports=睡眠;函数睡眠(毫秒){varstart=Date.now();if(milliseconds!==Math.floor(milliseconds)){thrownewTypeError('sleep只接受毫秒的整数');}elseif(milliseconds<0){thrownewRangeError('sleep只接受正数的毫秒数');}elseif(milliseconds!==(milliseconds|0)){thrownewRangeError('sleepdurationoutofrange')}milliseconds=milliseconds|0;varshouldEnd=开始+毫秒;try{childProcess.execFileSync(nodeBin,['-e','setTimeout(function(){},'+shouldEnd+'-Date.now());'],{timeout:毫秒,});}catch(ex){if(ex.code!=='ETIMEDOUT'){throwex;}}varend=Date.now();returnend-start;}黑色问号???这是多么奇怪的实现。查看节点文档,我发现同步进程创建#Thechild_process.spawnSync()、child_process.execSync()和child_process.execFileSync()方法是同步的,并且会阻塞Node.js事件循环,暂停执行任何额外的代码,直到生成的pro退出。像这样的阻塞调用主要用于简化通用脚本任务和简化启动时应用程序配置的加载/处理。????以上三种同步方法将阻塞nodejs事件循环,除非创建的子进程执行完后,下面的代码会继续执行。thread-sleep包的作者就是利用这个特性来实现sleep功能的。太神奇了,很多时候我们因为不熟悉文档而无法解决现有的问题??