Я застрял в этом вопросе весь день, и я не смог найти каких-либо решений, касающихся того, что я пытаюсь выполнить.
Я пытаюсь передать очереди потокам, порожденным в подпрограмме.-процессов.Очереди были созданы во входном файле и переданы каждому подпроцессу в качестве параметра.
Я делаю модульную программу для: а) запуска нейронной сети б) автоматического обновления моделей сети при необходимости в) регистрациисобытия / изображения из нейронной сети на серверы.Моя бывшая программа боготворила только одно ядро ЦП, работавшее с несколькими потоками, и работала довольно медленно, поэтому я решил, что мне нужно выполнить дополнительную обработку некоторых частей программы, чтобы они могли работать в своих собственных пространствах памяти с максимальной отдачей.
Подпроцесс:
- Связь клиент-сервер
- Управление веб-камерой и обработка изображений
- Создание интерфейса для нейронных сетей (есть 2 нейронные сети со своими собственнымиобрабатывать каждый)
4 всего подпроцесса.
По мере разработки мне нужно общаться через каждый процесс, чтобы они все были на одной странице с событиями с серверов и еще много чего.,Насколько я могу судить, наилучшим вариантом будет Queue.
(Уточнение: 'Queue' из модуля 'multiprocessing', НЕ модуль 'queue')
~~ Однако ~~
Каждый из этих подпроцессов порождает свои собственные потоки.Например, 1-й подпроцесс будет порождать несколько потоков: один поток в очереди для прослушивания событий с разных серверов и передачи их в разные области программы;один поток для прослушивания очереди, получающей изображения из одной из нейронных сетей;один поток для прослушивания очереди, получающей живые изображения с веб-камеры;и один поток для прослушивания очереди, получающей выходные данные из другой нейронной сети.
Я могу без проблем передавать очереди подпроцессам и эффективно их использовать.Однако, когда я пытаюсь передать их потокам внутри каждого подпроцесса, я получаю вышеуказанную ошибку.
Я довольно новичок в многопроцессорности;однако методология, лежащая в его основе, выглядит примерно такой же, как потоки, за исключением пространства совместно используемой памяти и GIL.
Это из Main.py;вход в программу.
from lib.client import Client, Image
from multiprocessing import Queue, Process
class Main():
def __init__(self, server):
self.KILLQ = Queue()
self.CAMERAQ = Queue()
self.CLIENT = Client((server, 2005), self.KILLQ, self.CAMERAQ)
self.CLIENT_PROCESS = Process(target=self.CLIENT.do, daemon=True)
self.CLIENT_PROCESS.start()
if __name__ == '__main__':
m = Main('127.0.0.1')
while True:
m.KILLQ.put("Hello world")
И это из client.py (в папке с именем lib)
class Client():
def __init__(self, connection, killq, cameraq):
self.TCP_IP = connection[0]
self.TCP_PORT = connection[1]
self.CAMERAQ = cameraq
self.KILLQ = killq
self.BUFFERSIZE = 1024
self.HOSTNAME = socket.gethostname()
self.ATTEMPTS = 0
self.SHUTDOWN = False
self.START_CONNECTION = MakeConnection((self.TCP_IP, self.TCP_PORT))
# self.KILLQ_THREAD = Thread(target=self._listen, args=(self.KILLQ,), daemon=True)
# self.KILLQ_THREAD.start()
def do(self):
# The function ran as the subprocess from Main.py
print(self.KILLQ.get())
def _listen(self, q):
# This is threaded multiple times listening to each Queue (as 'q' that is passed when the thread is created)
while True:
print(self.q.get())
# self.KILLQ_THREAD = Thread(target=self._listen, args=(self.KILLQ,), daemon=True)
Здесь выдается ошибка.Если я оставлю эту строку с комментариями, программа будет работать нормально.Я могу читать из очереди в этом подпроцессе без проблем (т. Е. Функция 'do'), не находясь в потоке этого подпроцесса (т. Е. Функция '_listen').
Мне нужно уметьвзаимодействовать через каждый процесс, чтобы они могли идти в ногу с основной программой (т. е. в случае обновления модели нейронной сети, подпроцесс вывода должен завершиться, чтобы модель могла обновляться без ошибок).
Любая помощь с этим была бы великолепна!
Я также очень открыт для других методов общения, которые также будут работать.В случае, если вы считаете, что лучший процесс коммуникации будет работать;он должен быть достаточно быстрым, чтобы поддерживать потоковую передачу изображений 4k, отправляемых на сервер с камеры в режиме реального времени.
Большое спасибо за потраченное время!:)