如何实现根据运行时间限制方法执行次数?
How to achieve a limited number of method executions based on elapsed time?
我想知道是否有类似框架的东西来限制每分钟的执行。
假设我有一个 API,每分钟可以请求 100 次。
如果我在循环中发送“hello world”,我将超过该限制。
例如,像这样:
ExecutionLimiter executer = ExecutionLimiter(executions: 100, duration: Duration(minutes: 1));
while (true) {
executer.add(() => print(“hello world“));
}
我找到了包 queue,但这只是为了并行化。
感谢您的帮助。
您可以使用 Timer.periodic 在每个给定时间激活一个方法。
_timer = Timer.periodic(Duration(milliseconds: 600), (Timer t) {
// Send single api request every 600 ms
});
// Stop sending requests
Future.delayed(const Duration(minutes: 1), () {
_timer.cancel();
});
只是不要忘记将它保存在变量中,并在使用完后将其丢弃。
感谢 的支持,我创建了一个简短的示例程序,在给定的时间跨度内执行函数 n 次。执行的持续时间被考虑在内。
import 'dart:async';
import 'dart:math';
List<Instance> instances = [];
int executionLimit = 10;
int apiCallLimitInSeconds = 5;
// for test purposes
int elapsedTime = 0;
int executedFunctions = 0;
main() {
Timer.periodic(Duration(seconds: 1), (Timer t) {
instances.removeWhere((element) => element.isInvalid);
for (int i = 0; instances.length < executionLimit; i++) {
instances.add(Instance(
Future.delayed(Duration(milliseconds: Random().nextInt(100)))
.then((value) => executedFunctions++)));
}
//tests again
elapsedTime++;
if (elapsedTime % 5 == 0) {
print(executedFunctions);
}
});
}
class Instance {
Future<void> execute;
bool isInvalid = false;
Instance(this.execute) {
execute.then((value) => Timer(
Duration(seconds: apiCallLimitInSeconds), () => isInvalid = true));
}
}
我想知道是否有类似框架的东西来限制每分钟的执行。
假设我有一个 API,每分钟可以请求 100 次。
如果我在循环中发送“hello world”,我将超过该限制。
例如,像这样:
ExecutionLimiter executer = ExecutionLimiter(executions: 100, duration: Duration(minutes: 1));
while (true) {
executer.add(() => print(“hello world“));
}
我找到了包 queue,但这只是为了并行化。
感谢您的帮助。
您可以使用 Timer.periodic 在每个给定时间激活一个方法。
_timer = Timer.periodic(Duration(milliseconds: 600), (Timer t) {
// Send single api request every 600 ms
});
// Stop sending requests
Future.delayed(const Duration(minutes: 1), () {
_timer.cancel();
});
只是不要忘记将它保存在变量中,并在使用完后将其丢弃。
感谢
import 'dart:async';
import 'dart:math';
List<Instance> instances = [];
int executionLimit = 10;
int apiCallLimitInSeconds = 5;
// for test purposes
int elapsedTime = 0;
int executedFunctions = 0;
main() {
Timer.periodic(Duration(seconds: 1), (Timer t) {
instances.removeWhere((element) => element.isInvalid);
for (int i = 0; instances.length < executionLimit; i++) {
instances.add(Instance(
Future.delayed(Duration(milliseconds: Random().nextInt(100)))
.then((value) => executedFunctions++)));
}
//tests again
elapsedTime++;
if (elapsedTime % 5 == 0) {
print(executedFunctions);
}
});
}
class Instance {
Future<void> execute;
bool isInvalid = false;
Instance(this.execute) {
execute.then((value) => Timer(
Duration(seconds: apiCallLimitInSeconds), () => isInvalid = true));
}
}