Я хотел бы динамически генерировать потоки или процессы в Python для использования каждой собственной очереди.
Мой код: main.py
import cv2
import numpy as np
from classes import roi_process
import time
import os
import copy
import queue
import multiprocessing
roi_list = eval("[(0,0,639,720,1),(640,0,1280,720,2)]")
for _ROI in roi_list:
print("@@@@@@@@@@@@@@@@@ " + str(_ROI[4]))
vars()["FILA_"+str(_ROI[4])] = queue.Queue(maxsize=4)
vars()["T_"+str(_ROI[4])] = multiprocessing.Process(target = roi_process.RoiProcess, args = ( eval("FILA_"+str(_ROI[4])) , str(_ROI[4])), daemon=True)
for _ROI in roi_list:
eval("T_"+str(_ROI[4])).start()
classes / roi_process.py
import cv2
import queue
import numpy as np
import imutils
import time
import os
class RoiProcess:
def __init__(self, queue_pool = None, id_roi = 0):
self.id_roi = id_roi
self.queue_pool = queue_pool
print("Iniciou em thread o id: " + self.id_roi)
self.run()
def run(self):
i = 0
while True:
print(str(self.id_roi) + ": " + str(i))
i = i + 1
time.sleep(1)
Это приводит к следующей ошибке:
(tensorflow) C:\projects\car detector\semparar\AI_CARANDPLATE>python main.py
@@@@@@@@@@@@@@@@@ 1
@@@@@@@@@@@@@@@@@ 2
Traceback (most recent call last):
File "main.py", line 64, in <module>
eval("T_"+str(_ROI[4])).start()
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\context.py", line 326, in _Popen
return Popen(process_obj)
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__
reduction.dump(process_obj, to_child)
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle '_thread.lock' object
(tensorflow) C:\projects\car detector\semparar\AI_CARANDPLATE>Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\spawn.py", line 107, in spawn_main
new_handle = reduction.duplicate(pipe_handle,
File "C:\Users\MasterRoot\Anaconda3\envs\tensorflow\lib\multiprocessing\reduction.py", line 79, in duplicate
return _winapi.DuplicateHandle(
PermissionError: [WinError 5] Acesso negado
Мне действительно нужно запускать динамические c потоки или процессы, чтобы использовать каждый опрос, который будет передаваться while True:
в main.py
Я сделаю программу чтения кадров opencv и нарежу основной кадр на множество частей. После этого я передам динамический c объект очереди с этой информацией, и каждый поток будет обрабатывать предиктор так, как мне нужно.
Я изменил свой код на:
FILA={}
T={}
#cria fila para cada ROI e instancia uma thread de obj para ler esta fila continuamente.
for _ROI in roi_list:
print("@@@@@@@@@@@@@@@@@ " + str(_ROI[4]))
FILA[_ROI[4]] = queue.Queue(maxsize=4)
T[_ROI[4]] = multiprocessing.Process(target = roi_process.RoiProcess, args = ( FILA[_ROI[4]] , str(_ROI[4])), daemon=True).start()
, но его поддержка собираюсь сделать ту же ошибку для потоков.