2016-07-11 7 views
1

Ich habe dieses seltsame Problem mit Push-Warteschlange.Google Application Engine Aufgabenwarteschlange - nur ein Element zulassen

Ich brauche nur eine Aufgabe zu einer Zeit aus dieser Warteschlange auszuführen. Ich habe eine Push-Warteschlange konfiguriert, bei der max-concurrent-requests auf 1 gesetzt sind. Wenn ich jedoch Aufgaben an die Warteschlange übergebe, laufen sie parallel. Ich musste die Rate auf 1 pro Minute verringern. Aber was passiert, wenn meine Aufgabe länger als 1 Minute dauert? Die beiden werden parallel laufen.

Ich habe auch versucht 1, aber es scheint immer noch mehrere Elemente parallel zu verarbeiten.

Wer weiß, wie die Warteschlange die Verarbeitung von jeweils nur einer Aufgabe zulässt?

Arun

+1

Können Sie erläutern, warum mehrere Aufgaben parallel ausgeführt werden, wenn Sie max gleich 1 setzen? – marcadian

+0

Wenn ich ein Debugging auf mein Servlet setze, das den Task ausführt, sehe ich zwei Threads im Debug stecken. Wenn ich drei Aufgaben einreiche, sehe ich drei Threads. Es ignoriert die Max-Concurrent-Anfragen –

Antwort

0

Das ist eine gute Möglichkeit, um zu verhindern, dass Tasks gleichzeitig ausgeführt werden. Einer Ihrer Kommentare deutet darauf hin, dass Sie nur auf dem Entwicklungsserver getestet haben. The dev server does not respect some of the task queue settings. Probieren Sie es in der Produktion aus, es sollte funktionieren.

Sie können dies überprüfen, indem Sie sicherstellen, dass Ihre Aufgaben sehr lange dauern, bis einige abgeschlossen sind. Wechseln Sie zur Konsole für Ihr Projekt, suchen Sie unter App Engine -> Aufgabenwarteschlangen und klicken Sie auf den Namen Ihrer Warteschlange. Sie werden sehen, wie viele gerade laufen.

+0

Ja. Ich habe es nur auf dem Dev-Server versucht. Der Link Dein Kommentar funktioniert nicht. Ich werde es in der Produktion versuchen und diese Antwort als richtig markieren, wenn es auf Produktion und nicht in Entwicklung arbeitet. –

+0

Opps! Entschuldigung wegen des kaputten Links. Fest. –

0

Zunächst einmal, auch wenn Sie für die Ausführung nur eine Aufgabe zu einer Zeit, einen Mechanismus implementieren, aber das Intervall zwischen den Aufgaben kürzer ist als die Aufgabe der Laufzeit, Sie gehen Ihre Aufgabe bekommen Schlange überbevölkert. Das heißt, ich sehe zwei mögliche Lösungen.

Lösung eins - Aktionstoken. Erstellen Sie einen Datenspeichereintrag, der angibt, ob eine Aufgabe ausgeführt wird. Jetzt, wenn jede Aufgabe gestartet wird, überprüft es die Datenbank, um festzustellen, ob eine andere Aufgabe ausgeführt wird, wenn eine andere Aufgabe ausgeführt wird, aktuelle Aufgabe einreihen, um es erneut in N Sekunden zu versuchen (verwenden Sie das countdown Argument: taskqueue.add(url='/tasks/your_task', countdown=delay_in_seconds, params=params)) (bitte beachten Sie Verwenden Pull-Warteschlangen und einen cron-Job, der fährt alle N Sekunden wieder mit Aktionsmarke - ‚ll einen Weg, um mit einer race-Bedingung hier)

Lösung zwei finden müssen. Jedes Mal, wenn der Maisjob ausgeführt wird, prüft er, ob eine Aufgabe ausgeführt wird. Wenn dies der Fall ist, macht der Cron nichts. Wenn keine Task ausgeführt wird, wird das Running-Flag in der Datenbank gesetzt. Wenn die Aufgabe beendet ist, wird sie aufgehoben.

+0

Vielen Dank für diese Lösungen. Ich könnte diese implementiert haben, aber ich möchte wissen, warum Max-Concurrent-Anfragen nicht funktioniert. –

Verwandte Themen