core: 优化任务分配逻辑

This commit is contained in:
undefined committed 2020-11-11 13:21:57 +08:00
1 parent cafb3b03e5
commit 5671eb0843
3 files changed
+30 -5

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "hydrooj",
"version": "2.13.49",
"version": "2.13.50",
"bin": "bin/hydrooj.js",
"main": "dist/loader.js",
"typings": "dist/loader.d.ts",
+21 -4
View File
@@ -1,5 +1,6 @@
import { ObjectID } from 'mongodb';
import { JudgeResultBody, Rdoc, TestCase } from '../interface';
import { sleep } from '../utils';
import * as record from '../model/record';
import * as problem from '../model/problem';
import * as builtin from '../model/builtin';
@@ -113,16 +114,32 @@ class JudgeHandler extends Handler {
}
class JudgeConnectionHandler extends ConnectionHandler {
processing: any;
processing: any = null;
async prepare() {
this.newTask();
}
async newTask() {
if (this.processing) return;
let t;
while (!t) {
// eslint-disable-next-line no-await-in-loop
await sleep(100);
// eslint-disable-next-line no-await-in-loop
t = await task.getFirst({ type: 'judge' });
}
this.send({ task: t });
this.processing = t;
}
async message(msg) {
console.log(msg);
if (msg.key === 'next') await next(msg);
else if (msg.key === 'end') {
await end({ judger: this.user._id, ...msg });
this.processing = null;
const t = await task.getFirst({ type: 'judge' });
this.send({ task: t });
this.processing = t;
await this.newTask();
}
}
+8
View File
@@ -193,3 +193,11 @@ export function buildProjection(fields: string[]): Record<string, 1> {
for (const k of fields) o[k] = 1;
return o;
}
export function sleep(timeout: number) {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, timeout);
});
}