Запускайте различные динамические процессы в Python - PullRequest
1 голос
/ 13 марта 2020

Я хотел бы динамически генерировать потоки или процессы в 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()

, но его поддержка собираюсь сделать ту же ошибку для потоков.

1 Ответ

0 голосов
/ 17 марта 2020

Не используйте стандартные Queue с многопроцессорной обработкой, используйте:

from multiprocessing import Queue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...