npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@ejfkdev/async-pool

v1.0.0

Published

JS asynchronous parallel pool

Downloads

8

Readme

MIT-license

特征

  • 并行执行任务
  • 自由控制任务执行速率
  • 执行调度暂停恢复
  • 任务重试
  • 支持多种任务形式
    • 单函数处理多条数据
    • 单数据指定执行函数
    • 函数即任务
  • 任务添加速率控制
  • 任务队列缓存控制
  • 任务全部完成事件防抖
  • 任务重试次数控制

Install

pnpm install @ejfkdev/async-pool

使用

import { AsyncPool } from '@ejfkdev/async-pool'

const pool = AsyncPool({
    parallel: 2,
    worker: (data)=>console.log(data)
})

pool.addTodo('task#1')
pool.addTodos('task#2', 'task#3')
pool.addWorkerTodo((data)=>console.info(data), 'task#4')
pool.addWorker(()=> console.debug('task#5'))

await pool.waitAllWorkerDone()

典型场景

爬虫

  1. 边爬边添加任务,防止任务过度积压
while(true){
    if (pool.queueCounts() > 10) await pool.waitParallelIdel()
    pool.addTodo('https://example.com')
}
  1. 执行速率控制,可自由选择令牌桶进行限速
pool.rateLimiter = (resolve)=> {
    // 执行resolve后才会运行一次任务
    resolve()
}
  1. 网站限频后可暂停整个队列,手动灵活恢复
pool.taskResultCallback = ({data,result,error,retry, pool})=>{
    // 任务出现异常
    if(result=='error' || error!=null){
        // 暂停任务队列,并设置恢复回调
        pool.pause((Resolve)=>{
            // 定时检查网站状态,直到正常访问
            while(isBlocking()){
                sleep(1000)
            }
            // 恢复队列执行
            Resolve()
        })
        // 该任务本身重新放入待执行队列
        retry()
    }
}
  1. 正确响应任务完成事件,避免任务执行快于添加误触发