Ein benutzerdefiniertes Multiprocessing.Manager-Objekt ordnungsgemäß entwerfen

8

Ich möchte das multiprocessing.Manager () -Objekt verwenden, damit ich Informationen von einem Arbeiter asynchron zum Manager senden kann, um Informationen an einen Server zu senden. Ich habe ungefähr 10 Instanzen, die PDFs auf die Festplatte schreiben. Ich wollte dann das Manager-Objekt im Multiprocessing-Paket verwenden, um diese Daten an meinen S3-Bucket zu senden, weil ich die lokale Inhaltserzeugung nicht unterdrücken möchte.

Ich frage mich also, ob ich ein benutzerdefiniertes Manager-Objekt erstellen kann. Ist das der richtige Weg? Wird jeder Prozess, der an das Manager-Objekt gesendet wurde, in die Warteschlange gestellt? oder wenn ich mehrere Uploads anrufe, wird der Manager einige Anrufe fallen lassen?

Unten ist ein Beispielcode von dem, was ich vorhabe zu tun:

%Vor%     
code base 5000 12.05.2015, 12:15
quelle

1 Antwort

2

Um einige Ihrer Fragen direkt zu beantworten:

  

Wird jeder Prozess, der an das Manager-Objekt gesendet wurde, in die Warteschlange gestellt?

Der Server Manager erzeugt einen neuen Thread, um jede eingehende Anfrage zu bearbeiten, so dass alle Ihre Anfragen sofort bearbeitet werden. Sie können dies innerhalb von multiprocessing/managers.py :

sehen %Vor%
  

Wenn ich mehrere Uploads anrufe, wird der Manager einige Anrufe fallen lassen?

Nein, keiner der Anrufe wird gelöscht.

%Vor%

Beide Aufrufe von upload.upload werden synchron sein; Sie werden erst zurückkehren, wenn UploadClass.upload abgeschlossen ist. Wenn jedoch mehrere Skripts / Threads / Prozesse gleichzeitig upload.upload aufrufen, wird jeder einzelne Aufruf gleichzeitig in seinem eigenen Thread im Prozess Manager server ausgeführt.

Und Ihre wichtigste Frage:

  

ist das der richtige Weg, dies zu tun?

Ich würde nein sagen, wenn ich die Frage richtig verstehe. Wenn Sie nur ein Skript haben und dann zehn multiprocessing.Process Instanzen in diesem einen Skript erzeugen, um die PDFs auszugeben, sollten Sie einfach ein anderes multiprocessing.Process verwenden, um die Uploads zu verarbeiten:

%Vor%

Wenn Sie eigentlich mit gleichzeitigen Uploads zufrieden sind, dann brauchen Sie keinen separaten upload -Prozess zu haben - laden Sie einfach direkt von den PDF-Schreibprozessen hoch.

Es ist schwer aus deiner Frage zu sagen, ob das genau das ist, was du tust. Sobald du geklärt hast, passe ich das letzte Stück an deinen speziellen Anwendungsfall an.

    
dano 15.05.2015, 19:09
quelle