Ich benutze Python Python Multiprocessing für einen RabbitMQ Consumers. Beim Start der Anwendung erstelle ich 4 WorkerProcesses.Python MultiProcessing
def start_workers(num=4):
for i in xrange(num):
process = WorkerProcess()
process.start()
Unten finden Sie meine WorkerClass. Die Logik funktioniert soweit, ich erstelle 4 parallele Consumer-Prozesse. Aber das Problem ist, nachdem ein Prozess getötet wurde. Ich möchte einen neuen Prozess erstellen. Das Problem in der Logik unten ist, dass der neue Prozess als untergeordneter Prozess von dem alten erstellt wird und nach einiger Zeit der Speicher nicht mehr voll ist. Gibt es eine Möglichkeit mit Python Multiprocessing einen neuen Prozess zu starten und den alten korrekt zu beenden?
class WorkerProcess(multiprocessing.Process):
def ___init__(self):
app.logger.info('%s: Starting new Thread!', self.name)
super(multiprocessing.Process, self).__init__()
def shutdown(self):
process = WorkerProcess()
process.start()
return True
def kill(self):
start_workers(1)
self.terminate()
def run(self):
try:
# Connect to RabbitMQ
credentials = pika.PlainCredentials(app.config.get('RABBIT_USER'), app.config.get('RABBIT_PASS'))
connection = pika.BlockingConnection(
pika.ConnectionParameters(host=app.config.get('RABBITMQ_SERVER'), port=5672, credentials=credentials))
channel = connection.channel()
# Declare the Queue
channel.queue_declare(queue='screenshotlayer',
auto_delete=False,
durable=True)
app.logger.info('%s: Start to consume from RabbitMQ.', self.name)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback, queue='screenshotlayer')
channel.start_consuming()
app.logger.info('%s: Thread is going to sleep!', self.name)
# do what channel.start_consuming() does but with stoppping signal
#while self.stop_working.is_set():
# channel.transport.connection.process_data_events()
channel.stop_consuming()
connection.close()
except Exception as e:
self.shutdown()
return 0
Danke
Aber ich Subprocces nicht gewohnt. Ich beginne Thread: 1, Schritt: 2, Thread: 3, Thread: 4. Jetzt Wenn Thread: 1 getötet wurde, erzeugt es einen neuen Subprozess Thread: 1: 1, und der nächste Thread wäre Thread: 1: 1: 1 das geht so lange, bis es keinen Speicher mehr gibt. Ich möchte, dass wenn Thread: 1 getötet wurde ein neuer Thread generiert wird Thread: XY. – ghovat
I Sie können Ihren Hauptprozess beschäftigt halten, er kann die 4 Threads überwachen und wenn einer beendet wird, kann er einen neu starten. Wenn deine Funktion 'start_worker' nach dem Start zurückkehren soll, starte einen Thread, der den Rest erledigt (starte 4 Threads und beobachte sie) – Paul
Verstanden, danke. Aber wenn ich einen neuen Thread erzeuge, bekomme ich einen Assertionsfehler, kann nicht zweimal starten 'AssertionError: kann einen Prozess nicht zweimal starten' – ghovat