Ich habe den Code in meinem Express-Server unten (habe es der Kürze wegen gekürzt). Ich habe ein gemeinsames Objekt, das ich in drei verschiedenen ruhigen Endpunkten hinzufüge/modifiziere/lese. Da alle HTTP-Anfragen in Nodejs asynchron sind, konnte ich beide Requests zur gleichen Zeit setzen und bekommen. Obwohl PUT passiert ist, aber sagen wir, dass der Status nicht aktualisiert ist, könnte mein GET eine etwas schale Antwort bekommen?Gibt es unten eine Racebedingung?
Von dem, was ich verstehe, und meine Tests zeigen, dass es hier keine Race Condition gibt. Da das Aktualisieren des Objekts results
eine synchrone Operation ist und alle asynchronen Operationen darauf warten sollten. Kann jemand mit einer besseren Erklärung helfen, ob das richtig ist oder nicht?
var obj = {};
const exec = require('child_process').exec;
app.post('/foo', (req, res) => {
var result = {};
result.id = generateSomeRandomId();
result.failed = 0;
result.status = 'running'
//execute some command and update result
const child = exec('some command');
child.stdout.on('data', (data) => {
//some logic
});
child.stderr.on('data', (data) => {
result.failed = result.failed + 1;
});
child.on('close', (code, signal) => {
if (signal !== null && signal !== undefined) {
result.status = 'cancelled';
} else {
result.status = 'completed';
result.runtime = calculateRunTime();
}
});
result.pid = child.pid;
obj[result.id] = result;
res.send(result);
}
app.put('/foo/:id', (req, res) => {
var result = obj[req.params.id];
if (result.status === 'running' && result.pid !== undefined) {
kill(result.pid, 'SIGKILL');
result.status = 'cancelled';
result.runtime = calculateRunTime();
}
res.send(result);
}
app.get('/foo/:id', (req, res) => {
var result = obj[req.params.id];
res.send(result);
}
sprichst du in 'app.post ('/ foo''? Es gibt kein" race ", aber du wirst" res.post (result); "bevor irgendwelche der asynchronen Teile überhaupt laufen ... so, was auch immer Sie zwischen '// führen Sie einen Befehl und update Ergebnis 'und' result.pid = Kind.pid; 'wird keinen Effekt auf das haben, was Sie in 'res.send (result) senden;' –
auch, 'result.failed = result.failed + 1;' resultiert in 'results.failed',' undefined' oder wenn irgendwelche Fehler, 'result.failed === NaN' –
@JaromandaX ja ich bekomme diesen Teil. Alle asynchronen Vorgänge in * post * warten, bis alle Synchronisierungsvorgänge abgeschlossen sind. Meine Frage war hauptsächlich auf gleichzeitige PUT und GET-Anfragen. Wäre ich dort rennfähig? Und Sie haben Recht mit dem Ergebnis. "NaN" -Teil fehlgeschlagen, ich übersprang die Initialisierung für die Kürze. Wird es wieder hinzufügen. – Manali