2 Stimmen

Python-Kommunikation zwischen Prozessen mit inaktiven Prozessen

Ich habe einen untätigen Hintergrundprozess, der Daten in einer Warteschlange verarbeitet, die ich wie folgt implementiert habe. Die Daten, die in diesem Beispiel übergeben werden, sind nur Ganzzahlen, aber ich werde Listen mit bis zu 1000 Ganzzahlen übergeben und bis zu 100 Listen pro Sekunde in die Warteschlange stellen. Ist dies der richtige Ansatz, oder sollte ich mich mit aufwendigeren RPC- und Server-Methoden befassen?

import multiprocessing
import Queue
import time

class MyProcess(multiprocessing.Process):

    def __init__(self, queue, cmds):
        multiprocessing.Process.__init__(self)  
        self.q = queue
        self.cmds = cmds

    def run(self):
        exit_flag = False
        while True:
            try:
                obj = self.q.get(False)
                print obj
            except Queue.Empty:
                if exit_flag:
                    break
                else:
                    pass
            if not exit_flag and self.cmds.poll():
                cmd = self.cmds.recv()
                if cmd == -1:
                    exit_flag = True
            time.sleep(.01)

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    proc2main, main2proc = multiprocessing.Pipe(duplex=False)
    p = MyProcess(queue, proc2main)
    p.start()
    for i in range(5):
        queue.put(i)    
    main2proc.send(-1)
    proc2main.close()
    main2proc.close()
    # Wait for the worker to finish
    queue.close()
    queue.join_thread()
    p.join()

0voto

Wulfram Punkte 3252

Das hängt davon ab, wie lange es dauert, die Daten zu verarbeiten. Ich kann das nicht sagen, weil ich keine Datenprobe habe, aber im Allgemeinen ist es besser, zu aufwändigeren RPC- und Servermethoden überzugehen, wenn Sie Dinge wie Lastausgleich, garantierte Betriebszeit oder Skalierbarkeit benötigen. Denken Sie nur daran, dass diese Dinge die Komplexität erhöhen, was die Bereitstellung, das Debugging und die Wartung Ihrer Anwendung erschweren kann. Außerdem erhöht sich dadurch die Latenzzeit, die für die Verarbeitung einer Aufgabe benötigt wird (was für Sie von Bedeutung sein kann oder auch nicht).

Ich würde es mit einigen Beispieldaten testen und feststellen, ob Sie die Skalierbarkeit benötigen, die mehrere Server bieten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X