首页 > 其他分享 >chatGPT的js信号量实现

chatGPT的js信号量实现

时间:2023-08-28 18:34:34浏览次数:32  
标签:resolve const maxConcurrency await js 信号量 async chatGPT

信号量类

在 JavaScript 中,可以使用 Promise 和 async/await 来模拟信号量,下面是一个简单的信号量实现:

class Semaphore {
  constructor(maxConcurrency) {
    this.maxConcurrency = maxConcurrency;
    this.currentConcurrency = 0;
    this.queue = [];
  }

  async acquire() {
    return new Promise((resolve) => {
      const tryAcquire = () => {
        if (this.currentConcurrency < this.maxConcurrency) {
          this.currentConcurrency++;
          resolve();
        } else {
          this.queue.push(tryAcquire);
        }
      };
      tryAcquire();
    });
  }

  release() {
    this.currentConcurrency--;
    if (this.queue.length > 0) {
      const next = this.queue.shift();
      next();
    }
  }

  async withLock(task) {
    await this.acquire();
    try {
      await task();
    } finally {
      this.release();
    }
  }
}

这个 Semaphore 类有一个构造函数,它接受一个参数 maxConcurrency,表示允许的最大并发数。acquire 方法尝试获取信号量,如果当前并发数小于最大并发数,它将立即解析。否则,它将等待直到有可用的信号量。release 方法释放信号量并唤醒等待队列中的下一个任务。withLock 方法是一个方便的包装器,它自动获取和释放信号量。

使用示例

const semaphore = new Semaphore(3); // 最大并发数为 3

async function doTask(taskId) {
  console.log(`Task ${taskId} started`);
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.log(`Task ${taskId} finished`);
}

async function main() {
  const tasks = [];
  for (let i = 0; i < 10; i++) {
    tasks.push(semaphore.withLock(() => doTask(i)));
  }
  await Promise.all(tasks);
}

main();

在这个例子中,创建了一个信号量,最大并发数为 3。然后定义了一个异步函数 doTask,它模拟一个耗时的任务。在 main 函数中,创建了 10 个任务,并使用 withLock 方法确保最多只有 3 个任务同时运行。最后,等待所有任务完成。

标签:resolve,const,maxConcurrency,await,js,信号量,async,chatGPT
From: https://www.cnblogs.com/aquester/p/17663118.html

相关文章

  • ChatGPT 对教育的影响,AI 如何颠覆传统教育
    胜量老师来源:BV1Nv4y1H7kC由ChatGPT引发的对教育的思考,人类文明发展至今一直靠教育完成文明的传承,一个年轻人要经历若干年的学习,才能进入社会投入对文明的建设,而学习中有大量内容是需要记忆和反复训练的。无疑缩短了每代人的有效时间,而对于教师又何尝不是如此呢,AI的出现彻底......
  • 复旦赵斌:ChatGPT将颠覆我们的学术和教育,你准备好了吗?
    来源:BV1pM4y197cu从2022年11月开始,美国加利福尼亚州OpenAI推出的ChatGPT,可以说是出尽了风头,它首先从Internet,整理出了一个庞大的文本数据库,然后利用统计模型,学习和模仿数据库当中的语言。生成了令人信服的人类可读的文本,这种内容文字已经达到了以假乱真的程度,虽然目前称ChatGP......
  • 基于JS实现回到页面顶部的五种写法(从实现到增强)
    这篇文章主要介绍了基于JS实现回到页面顶部的五种写法(从实现到增强)的相关资料,本文介绍的非常详细,实用性也非常高,非常具有参考借鉴价值,需要的朋友可以参考下 写法【1】锚点使用锚点链接是一种简单的返回顶部的功能实现。该实现主要在页面顶部放置一个指定名称的锚......
  • Newtonsoft.Json:JObject 动态添加字段/List<JObject>转DataTable
    1.JObject动态添加字段;varjsonObject=newJObject();foreach(varkeyinKeys){jsonObject.Add(key,value);}jsonObject.Add("*****","1");2. List<JObject>转DataTable1): 首先List<JObject>转stringList<JObject>jso......
  • js 过滤器~过滤方法
    在之前的学习中,我们接触了大量的选择器,包括基本选择器、伪类选择器等。为了更加方便快速地操作元素,除了选择器之外,jQuery还为我们提供了以“方法”(类似于函数方法)形式存在的两种方式:过滤方法和查找方法。过滤方法和查找方法跟之前学习的选择器之间是互补关系,它们补充了很多使用选......
  • 关于 Vue.js v2 和 v3 生命周期的概述以及它们之间的区别
    Vue.jsv2的生命周期包括以下阶段:1、beforeCreate:在实例初始化之后、实例数据观测和事件配置之前被调用。2、created:实例已经创建完成,数据观测和事件配置已完成,但尚未挂载到DOM上。3、beforeMount:在挂载之前被调用,相关的render函数首次被调用。4、mounted:实例已......
  • cocos2dx 3.x打包出现Can't find config file .cocos-project.json in path
    youcanjustcreatea.cocos-project.jsonfileyourself.Allitcontainsisthefollowingcode: {"project_type":"cpp"如果是lua工程话,直接修改成lua即可。......
  • Js操作Select大全(取值、设置选中等等)
    Js操作Select大全(取值、设置选中等等) jquery操作select(取值,设置选中)每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了。比如<selectclass="selector"></select>1、设置value为pxx的项选中$(".selector").val("pxx");2、设置text为pxx的项选中$......
  • DWR util.js 整理(DWR 处理各种form表单Select/option,table等,
    /********************/util.js包含一些有用的函数function,用于在客户端页面调用.主要功能如下:代码$()获得页面参数值addOptionsandremoveAllOptions初始化下拉框addRowsandremoveAllRows填充表格getText取得text属性值getValue取得form表......
  • JSTL中forEach标签 varStatus属性值
    特性        Getter                     描述current   getCurrent()         当前这次迭代的(集合中的)项index      getIndex()              当前这次迭代从0开始的迭代索引count     getCount()......