相关问题 更多 >
编程相关推荐
- ArrayList Java中的搜索字符串
- 另一个web应用程序的java访问会话
- 另一个应用程序中的活动和服务之间的java通信
- java根据Json字符串类型将Json字符串转换为对象
- eclipse如何解决java中的错误异常。lang.NoSuchMethodError:'java。字符串javax。摆动JOptionPane。showInputDialog(java.lang.String)'
- 线程“main”java中的安卓异常。lang.NoClassDefFoundError:org/codehaus/jackson/JsonParseException
- java如何在安卓 emulator上显示Mat图像?使用NDK
- Java在本地读取测试源文件,但在服务器上读取失败
- java dowhile循环用于计算输入数字中的数字。故障排除代码
- JAva初学者在编写获取成本的方法时遇到困难
像这样的事情并不难创造你自己,它会给你所需的灵活性。在
有一些奇特的方法,比如跟踪每一个的开始和完成时间,并检查你是否在一秒钟内发送了10个。在
系统可能还将其限制为10个活动请求(也就是说,你不能启动100个请求,每秒10个,然后让它们全部处理)。在
如果你假设这样,我会说一次性启动10个,然后让它们完成,然后启动下一个批次。你也可以启动10个,然后每完成一个就额外启动1个。你可以把它想象成“thread pool”。在
您可以通过一个简单的变量跟踪正在进行的调用数来轻松跟踪这一点。然后,只需检查每秒有多少个调用正在进行(以避免1秒的限制),如果您有可用的“线程”,就启动更多的新请求。在
它可能看起来像这样:
const threadLimit = 10; const rateLimit = 1000; // ms let activeThreads = 0; const calls = new Array(100).fill(1).map((_, index) => index); // create an array 0 through 99 just for an example function run() { if (calls.length == 0) { console.log('complete'); return; } // threadLimit - activeThreads is how many new threads we can start for (let i = 0; i < threadLimit - activeThreads && calls.length > 0; i++) { activeThreads++; // add a thread call(calls.shift()) .then(done); } setInterval(run, rateLimit); } function done(val) { console.log(`Done ${val}`); activeThreads ; // remove a thread } function call(val) { console.log(`Starting ${val}`); return new Promise(resolve => waitToFinish(resolve, val)); } // random function to simulate a network call function waitToFinish(resolve, val) { const done = Math.random() < .1; // 10% chance to finish done && resolve(val) if (!done) setInterval(() => waitToFinish(resolve, val), 10); return done; } run();
;基本上,
run()
只是根据限制和完成的线程数来启动它能启动多少个新线程。然后,它只是每秒钟重复这个过程,尽可能地添加新的过程。在您可能需要使用
threadLimit
和rateLimit
值,因为大多数速率限制系统实际上不允许您直接到达限制,并且不会在完成后立即释放它。在