Der Unterprozess in Python kann nicht beendet werden, wenn die Warteschlange verwendet wirdPython

Python-Programme
Guest
 Der Unterprozess in Python kann nicht beendet werden, wenn die Warteschlange verwendet wird

Post by Guest »

Zuallererst bin ich ein Neuling im Bereich Multiprocessing. Ich versuche, einen einfachen Kamerasimulator zu implementieren, der Bilder in einem Unterprozess generiert und sie in eine Warteschlange stellt, damit ein anderer Unterprozess sie verarbeiten kann. Ein initialisierter Kamerasimulator-Unterprozess (Kamera) hängt/friert ein, wenn ich versuche, die Methode camera.join() aufzurufen, um das Programm abzuschließen.

Code: Select all

import multiprocessing
import queue
import time
import numpy as np

class CameraSimulator(multiprocessing.Process):
def __init__(self, queue):
super().__init__()
self.queue = queue
self.connected = multiprocessing.Event()
self.acquiring = multiprocessing.Event()

def run(self):
while self.connected.is_set():
while self.acquiring.is_set():
image = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
try:
self.queue.put(image)
except queue.Full:
continue
time.sleep(0.1)

def connect(self):
self.connected.set()
self.start()

def disconnect(self):
self.connected.clear()

def acquire(self):
self.acquiring.set()

def stop(self):
self.acquiring.clear()

if __name__ == "__main__":

image_queue = multiprocessing.Queue(maxsize=1000)
camera = CameraSimulator(image_queue)

print("Connect camera")
camera.connect()

print("Start camera acquisition")
camera.acquire()
time.sleep(2)
print("Stop camera acquisition")
camera.stop()

time.sleep(2)

print("Start camera acquisition again")
camera.acquire()
time.sleep(2)
print("Stop camera acquisition")
camera.stop()

print("Disconnect camera")
camera.disconnect()

print("Draining queue")
while not image_queue.empty():
try:
image_queue.get_nowait()
except queue.Empty:
break
print("Queue drained")

camera.join()
print("Camera process terminated")
Das Problem scheint darin zu liegen, dass die Warteschlange nicht leer ist. Deshalb habe ich bewusst versucht, die Warteschlange zu entleeren, aber das Problem besteht weiterhin. Könnte es sein, dass der Aufruf von empty() aufgrund der Multithreading-/Multiprocessing-Semantik keine zuverlässige Möglichkeit ist, zu überprüfen, ob eine Warteschlange leer ist? Ich könnte camera.terminate() verwenden, um den Unterprozess zwangsweise zu beenden, aber ich gehe davon aus, dass dies keine gute Vorgehensweise ist. Jede Hilfe wäre sehr dankbar!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post