node thread.sleep实现示例

最近在写一些奇怪的东西的时候,发现大佬们用go或者其他语言实现的并发任务用了thread.sleep让主进程暂停。

回头一想,妈个鸡我要复制粘贴到node一直循环不合适啊,我也需要暂停来着!

怎么办??

抓了脑袋一会去npm上找了下相关的包,发现有个叫thread-sleep的包,下载量还挺高。

抱着好奇心去看了下源码,又发现源码相当之骚气

'use strict';

var childProcess = require('child_process');
var nodeBin = process.argv[0];

module.exports = sleep;
function sleep(milliseconds) {
 var start = Date.now();
 if (milliseconds !== Math.floor(milliseconds)) {
  throw new TypeError('sleep only accepts an integer number of milliseconds');
 } else if (milliseconds < 0) {
  throw new RangeError('sleep only accepts a positive number of milliseconds');
 } else if (milliseconds !== (milliseconds | 0)) {
  throw new RangeError('sleep duration out of range')
 }
 milliseconds = milliseconds | 0;

 var shouldEnd = start + milliseconds;
 try {
  childProcess.execFileSync(nodeBin, [ '-e',
   'setTimeout(function() {}, ' + shouldEnd + ' - Date.now());'
  ], {
   timeout: milliseconds,
  });
 } catch (ex) {
  if (ex.code !== 'ETIMEDOUT') {
   throw ex;
  }
 }
 var end = Date.now();
 return end - start;
}

黑人问号???

这是什么奇怪的实现。

翻阅node文档发现

Synchronous Process Creation#

The child_process.spawnSync(),
child_process.execSync(), and child_process.execFileSync() methods are synchronous and WILL block the Node.js event loop,
pausing execution of any additional code until the spawned process exits.

Blocking calls like these are mostly useful for simplifying general-purpose scripting tasks and for simplifying the loading/processing of application configuration at startup.
???

以上三种同步方法会阻塞nodejs的事件循环,除非创建的子进程执行完了,才会继续执行下面的代码。

thread-sleep包的作者正是利用这一特性实现了sleep功能。叹为观止

所以很多时候我们没办法解决现有问题的原因是对文档不熟么??

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • nodejs中sleep功能实现暂停几秒的方法

    我在网上了解了一下nodejs中sleep功能,搜索了很多关于nodejs中sleep功能介绍,下面我来记录一下,有需要了解的朋友可参考.希望此文章对各位有所帮助. 一 背景 在使用nodejs爬虫的时候,经常会遇到别人的网站对频率的反爬机制,这个时候如果不做处理程序就会挂掉,重新启动也会继续被屏蔽.这个问题怎么解决呢,我的想法就是程序暂停10分钟或者更长的时间,继续爬取. 二 方法 其实使用setTimeout就可以实现,只是nodejs异步已经很金字塔了,再加一层会更恐怖,所以本文使用nod

  • nodejs中实现sleep功能实例

    nodejs最让人不爽的就是其单线程特性,很多事情没法做,对CPU密集型的场景,性能也不够强劲.很长一段时间,我想在javascript语言框架下寻求一些解决方案,解决无法操作线程.性能差的问题.曾经最让我印象深刻的方案是fibers,不过fibers也好,其他方案也好,在线程操作上还是很别扭,太过依赖辅助线程,本末倒置:就fiber而言,javascript固有的低性能问题并不能解决:最别扭的是在javascript语言框架下,线程间的消息传递常常很受限制,经常无法真正地共享对象. nodej

  • node thread.sleep实现示例

    最近在写一些奇怪的东西的时候,发现大佬们用go或者其他语言实现的并发任务用了thread.sleep让主进程暂停. 回头一想,妈个鸡我要复制粘贴到node一直循环不合适啊,我也需要暂停来着! 怎么办?? 抓了脑袋一会去npm上找了下相关的包,发现有个叫thread-sleep的包,下载量还挺高. 抱着好奇心去看了下源码,又发现源码相当之骚气 'use strict'; var childProcess = require('child_process'); var nodeBin = proce

  • 实战node静态文件服务器的示例代码

    本篇文章主要介绍了实战node静态文件服务器的示例,分享给大家,具体如下: 支持功能: 读取静态文件 访问目录可以自动寻找下面的index.html文件, 如果没有index.html则列出文件列表 MIME类型支持 缓存支持/控制 支持gzip压缩 Range支持,断点续传 全局命令执行 子进程运行 1. 创建服务读取静态文件 首先引入http模块,创建一个服务器,并监听配置端口: const http = require('http'); const server = http.create

  • node文字生成图片的示例代码

    今天老板提了需求,要在服务端生成邀请卡,嗯-,简单的说就是把要这张: 变成差多这样的: 后端搞ruby的哥们搞了个html转图片,说转得太慢了,我就把这坑接下来了 所以睡前就倒腾了下,搞了个简单的实现 解决思路 文字转svg -> svg转png -> 合并图片 相关轮子 images Node.js 轻量级跨平台图像编解码库,不需要额外安装依赖 text-to-svg 文字转svg svg2png svg转png图片 示例代码 'use strict'; const fs = require

  • 教你如何用node连接redis的示例代码

    安装redis并启动 下载地址,选择Stable版本下载 或者本地下载地址:https://www.jb51.net/softs/504128.html 解压后,进入文件夹然后安装 cd redis-4.0.9 make//安装 启动redis服务 ./src/redis-server -p 端口号,默认端口为6379,可不带端口号启动 进入redis 客户端 ./src/redis-cli 关闭redis:进入客户端后,输入shutdown即可关闭redis服务 后台启动redis服务 打开r

  • Node调用Java的示例代码

    Java 端作为服务提供者,基于Dubbo实现服务并通过 Dubbo Hessian 扩展暴露服务:Node 端作为服务消费者,通过node-hessian 调用 Java 端的服务. Java 端 服务接口 package com.yuanxin.paas.ssb; public interface TestService { /** * 测试:无参,无返回值. */ void test(); /** * 测试:原生类型参数与返回值. * * @param i * @return */ Str

  • Forever+nginx部署Node站点的方法示例

    最近入手了一款最便宜的腾讯云服务器,主要用来部署自己的个人博客以及学习一些liunx知识,从而全方面了解掌握web技术.强烈建议前端人员拥有一个属于自己的服务器.在写此文章之前,我的云服务器已经安装好Mysql以及node, nginx等.下面以部署node网站为例,讲解几个常见的场景 线程持久运行 一般来说,我们在window cmd上通过node index.js启动一个服务器,只要不关闭,就可以一直访问和调用接口.但是在linux上往往如果长时间不操作或者你要执行其他操作时候,你的node

  • 手把手带你搭建一个node cli的方法示例

    前言 前端日常开发中,会遇见各种各样的 cli,使用 vue 技术栈的你一定用过 @vue/cli ,同样使用 react 技术栈的人也一定知道 create-react-app .利用这些工具能够实现一行命令生成我们想要的代码模版,极大地方便了我们的日常开发,让计算机自己去干繁琐的工作,而我们,就可以节省出大量的时间用于学习.交流.开发. cli 工具的作用在于它能够将我们开发过程中经常需要重复做的事情利用一行代码来解决,比如我们在写需求的时候每新增一个页面就需要相应的增加该页面的初始化代码,

  • Node.js创建HTTP文件服务器的使用示例

    HelloWorld示例只有演示意义,这次我们来搞一个实际的例子:文件服务器.我们使用Node.js创建一个HTTP协议的文件服务器,你可以使用浏览器或其它下载工具到文件服务器上下载文件. 为了读取文件,我们会用到File System模块(名字是"fs"),Stream,我们还要分析URL,区别HTTP方法,还会用到EventEmitter. 文件服务器FileServer的代码 先上代码吧,依然是简单的: // 引入http模块 var http = require("h

  • C#多线程Thread使用示例详解

    本文实例为大家分享了C#多线程Thread使用的示例代码,供大家参考,具体内容如下 多线程: 线程生命周期状态图: C#线程优先级(概率高低): 基本使用示例: using System; using System.Threading; namespace month_9_10._1009 { class Run5 { /* 测试线程的调用过程 * 主线程输出world,子线程输出hello */ public static void showHello() { for(int i = 0; i

  • Java 基于AQS实现自定义同步器的示例

    一.AQS-条件变量的支持 在如下代码中,当另外一个线程调用条件变量的signal方法的时候(必须先调用锁的lock方法获取锁),在内部会把条件队列里面队头的一个线程节点从条件队列里面移除并且放入AQS的阻塞队列里面,然后激活这个线程. public final void signal() {  if(!isHeldExclusively()) {   throw IllegalMonitorException();  }  Node first = firstWaiter;  if(first

随机推荐