

























@@ -31,6 +31,7 @@ const DEFAULT_SLOW_LISTENER_THRESHOLD_MS = 30_000;
3131export class DiscordEventQueue {
3232private readonly options: Required<DiscordEventQueueOptions>;
3333private readonly queue: DiscordEventQueueJob[] = [];
34+private queueHead = 0;
3435private processing = 0;
3536private processedCount = 0;
3637private droppedCount = 0;
@@ -52,7 +53,7 @@ export class DiscordEventQueue {
5253}
53545455enqueue(params: Omit<DiscordEventQueueJob, "resolve" | "reject">): Promise<void> {
55-if (this.queue.length >= this.options.maxQueueSize) {
56+if (this.pendingQueueSize >= this.options.maxQueueSize) {
5657this.droppedCount += 1;
5758return Promise.reject(
5859new Error(
@@ -68,7 +69,7 @@ export class DiscordEventQueue {
68696970getMetrics(): DiscordEventQueueMetrics {
7071return {
71-queueSize: this.queue.length,
72+queueSize: this.pendingQueueSize,
7273processing: this.processing,
7374processed: this.processedCount,
7475dropped: this.droppedCount,
@@ -78,9 +79,31 @@ export class DiscordEventQueue {
7879};
7980}
808182+private get pendingQueueSize(): number {
83+return Math.max(0, this.queue.length - this.queueHead);
84+}
85+86+private takeNextJob(): DiscordEventQueueJob | undefined {
87+if (this.queueHead >= this.queue.length) {
88+this.queue.length = 0;
89+this.queueHead = 0;
90+return undefined;
91+}
92+const job = this.queue[this.queueHead];
93+this.queueHead += 1;
94+if (this.queueHead >= this.queue.length) {
95+this.queue.length = 0;
96+this.queueHead = 0;
97+} else if (this.queueHead > 256 && this.queueHead * 2 > this.queue.length) {
98+this.queue.splice(0, this.queueHead);
99+this.queueHead = 0;
100+}
101+return job;
102+}
103+81104private processNext(): void {
82-while (this.processing < this.options.maxConcurrency && this.queue.length > 0) {
83-const job = this.queue.shift();
105+while (this.processing < this.options.maxConcurrency && this.pendingQueueSize > 0) {
106+const job = this.takeNextJob();
84107if (!job) {
85108return;
86109}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。