async-pool实现控制并发请求

什么是并发控制

假设有6个待办任务要执行,而我们希望限制同时执行的任务个数,即最多只有2个任务能同时执行。当正在执行任务列表中的任何1个任务完成后,程序会自动从待办任务列表中获取新的待办任务并把该任务添加到正在执行任务列表中。

图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

async-pool

本文使用了async-pool库来实现并发控制

async-pool的使用

 const timeout = i => new Promise(resolve => setTimeout(() => resolve(i), i))
 await asyncPool (5,[1000,2000,3000,4000],timeout)

其中,asyncPool是实现并发控制的主体函数,形式如下
function asyncPool(poolLimit, array, iteratorFn){ ... }

参数介绍

  • poolLimit(Number):表示限制的并发数;
  • array(Array):表示任务数组;
  • iteratorFn(FunctionaAz):表示迭代函数,用于实现对每个任务项进行处理,该函数会返回一个 Promise 对象或异步函数。

async-pool的实现

实现的核心是通过Promise.all()Promise.race()配合

        async function asyncPool (poolLimit,array,iteratorFn) {
            const ret = [] // 存储所有的异步任务
            const executing = [] // 存储所有正在执行的任务
            for (const item of array) {
                const p = Promise.resolve().then(() => iteratorFn(item,array)) 
                // 调用iteratorFn函数创建异步任务
                ret.push(p)
                // 保存新的异步任务

                if (poolLimit <= array.length) {
                    // 当poolLimit小于等于总任务数量时,进行并发控制
                    const e = p.then(() => executing.splice(executing.indexOf(e),1))
                    // 当任务完成后,从正在执行的任务队列中移除任务,腾出一个空位
                    executing.push(e)
                    // 加入正在执行的异步任务

                    if (executing.length >= poolLimit) {
                        await Promise.race(executing)   
                        // 有任务执行完成之后,进入下一次循环
                    }
                }
            }
            return Promise.all(ret) // 所有任务完成之后返回
        }

参考文档

JavaScript 中如何实现并发控制?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Python代码示例,演示如何使用gRPC实现客户端和服务端的多进程并发执行: 服务端代码: ```python import grpc from concurrent import futures import time import hello_pb2 import hello_pb2_grpc class HelloService(hello_pb2_grpc.HelloServicer): def sayHello(self, request, context): print("Received message: ", request.message) return hello_pb2.HelloReply(message="Hello, %s!" % request.message) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) hello_pb2_grpc.add_HelloServicer_to_server(HelloService(), server) server.add_insecure_port("[::]:50051") server.start() print("Server started at [::]:50051") while True: time.sleep(86400) if __name__ == '__main__': serve() ``` 客户端代码: ```python import grpc import hello_pb2 import hello_pb2_grpc from concurrent import futures import multiprocessing def run_client(): channel = grpc.insecure_channel("localhost:50051") stub = hello_pb2_grpc.HelloStub(channel) response = stub.sayHello(hello_pb2.HelloRequest(message="world")) print("Response received from server: ", response.message) if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) for i in range(4): pool.apply_async(run_client) pool.close() pool.join() ``` 在上面的示例中,服务端使用了Python的concurrent.futures模块创建了一个线程池,用于处理客户端的请求,同时使用了Python的multiprocessing模块创建了多个子进程,同时向服务端发起请求。客户端通过调用multiprocessing.Pool()方法创建进程池,并使用apply_async()方法异步调用run_client()方法,实现了多个客户端同时向服务端发起请求并发执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值