Initialisieren eines Arbeiters mit Argumenten mit Sellerie

8

Ich habe Probleme, etwas zu finden, das für mich relativ einfach zu sein scheint.

Ich verwende Sellery 3.1 mit Python 3 und möchte meine Worker mit Argumenten initialisieren, damit sie diese Details für die Einrichtung verwenden können.

Im Einzelnen: Diese Mitarbeiter werden Aufgaben ausführen, die die Interaktion mit einer API eines Drittanbieters erfordern, die Authentifizierungsdaten verwendet. Es ist erforderlich, dass der Mitarbeiter die Authentifizierungsdetails an den API-Server weitergibt, bevor Aufgaben ausgeführt werden (die Authentifizierungsdetails werden nach der ersten Authentifizierungsanforderung in Cookies gespeichert).

Ich möchte diese Anmeldedaten an den Mitarbeiter weitergeben, wenn dieser über die CLI gestartet wird. Ich möchte dann, dass sich der Benutzer authentifiziert, indem er sie verwendet und die Sitzung speichert, um zukünftige Aufgaben zu konsumieren (idealerweise würde dies in einem Attribut gespeichert werden, auf das von Aufgaben zugegriffen werden kann).

Ist das mit Sellerie möglich?

Als Nebenbemerkung habe ich darüber nachgedacht, ein requests.session -Objekt (aus der Python requests -Bibliothek) als Task-Argument zu übergeben, aber das würde eine Serialisierung erfordern, die wie verpönt aussieht.

    
Joshua Gilman 21.11.2014, 21:16
quelle

2 Antworten

16

Ich würde vorschlagen, eine abstrakte Aufgabenbasisklasse zu verwenden und die requests.session zwischenzuspeichern.

Aus der Sellerie-Dokumentation:

  

Eine Task wird nicht für jede Anforderung instanziiert, sondern in der Task-Registrierung als globale Instanz registriert.

     

Dies bedeutet, dass der __init__ -Konstruktor nur einmal pro Prozess aufgerufen wird und dass die Task-Klasse semantisch näher an einem Actor liegt.

     

Dies kann auch nützlich sein, um Ressourcen zwischenzuspeichern ...

%Vor%

Wenn Sie nun die Aufgaben erstellen, die API-Anfragen stellen:

%Vor%

Sie können auch die API-Authentifizierungsoptionen übergeben, indem Sie app.task decorator als zusätzliches Argument verwenden, das für die __dict__ der Aufgabe festgelegt wird, zum Beispiel:

%Vor%

Und lassen Sie die Basisklasse die übergebenen Authentifizierungsoptionen verwenden:

%Vor%

Sie können mehr auf der Celery-Dokumentations-Website lesen:

Kehren Sie nun zu Ihrer ursprünglichen Frage zurück, die zusätzliche Argumente an den Worker über die Befehlszeile weitergibt:

Es gibt einen Abschnitt darüber in den Sellery-Dokumenten Adding Neue Befehlszeilenoptionen , hier ein Beispiel für die Übergabe eines Benutzernamens und eines Kennworts an den Worker über die Befehlszeile:

%Vor%

Der Code:

%Vor%     
Pierre 23.11.2014, 21:31
quelle
0

Ich würde denken, Sie könnten das Skript, das Sie geschrieben haben, mit Befehlszeilenargumenten aufrufen. Etwas wie das Folgende:

%Vor%

Innerhalb Ihres Skripts können Sie Ihre Hauptfunktion in einen @celery.task oder @app.task Dekorator einschließen.

%Vor%

Etwas wie das sollte dich beginnen. Schauen Sie sich auch Pythons argparse für eine ausgeklügeltere Argumentanalyse an.

    
Mike Driscoll 21.11.2014 22:05
quelle

Tags und Links