Подпроцесс в Python не завершается при использовании очередиPython

Программы на Python
Ответить
Anonymous
 Подпроцесс в Python не завершается при использовании очереди

Сообщение Anonymous »

Прежде всего, я новичок в многопроцессорной обработке. Я пытаюсь реализовать простой симулятор камеры, который будет генерировать изображения в подпроцессе и помещать их в очередь для их обработки в другом подпроцессе. Инициализированный подпроцесс симулятора камеры (камера) зависает/зависает, когда я пытаюсь вызвать метод camera.join() для завершения программы.

Код: Выделить всё

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")
Похоже, проблема в том, что очередь не пуста. Поэтому я сознательно пытался слить очередь, но проблема осталась. Может ли быть так, что вызов пустой() не является надежным способом проверить, пуста ли очередь из-за семантики многопоточности/многопроцессорности? Я мог бы использовать camera.terminate() для принудительного завершения подпроцесса, но я считаю, что это не очень хорошая практика. Любая помощь будет принята с благодарностью!

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-utilized
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»