在Python中动态启动各种进程
我想在Python中动态生成一个线程或进程来使用每个队列 我的代码:main.py在Python中动态启动各种进程,python,multithreading,process,Python,Multithreading,Process,我想在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_li
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()
类别/roi\u流程.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
但是它会继续对线程执行相同的错误。不要在多处理中使用标准的
队列,请使用:
from multiprocessing import Queue
不要将标准队列
用于多处理,请使用:
from multiprocessing import Queue
vars()。使用像列表
或dict
这样的容器,不要动态创建变量。Python不是bash,摆脱动态生成代码字符串的习惯,然后执行它们。你能给我举个例子吗?当然,roi\u list=eval(“[(0,0639720,1),(640,01280720,2)]”)是疯狂的。您使用roi\u list=[(0,0639720,1)、(640,01280720,2)]
。不要使用dict
,FILAS={}
而使用FILAS[\u-ROI[4]]
等,不要使用eval
。如果你是一个初学者,基本上没有理由使用它。动态代码执行适用于那些正在做特殊事情的人,比如构建调试器等,除非你这样做,否则你的代码几乎肯定不会出现eval
或内省vars()
,globals()
,locals()
等问题,我认为,就是不能picklequeue.queue(maxsize=4)
对象。因为它们包含不可点击的''线程.lock'
对象,并且多处理使用pickle
进行进程间通信。vars()。使用像列表
或dict
这样的容器,不要动态创建变量。Python不是bash,摆脱动态生成代码字符串的习惯,然后执行它们。你能给我举个例子吗?当然,roi\u list=eval(“[(0,0639720,1),(640,01280720,2)]”)是疯狂的。您使用roi\u list=[(0,0639720,1)、(640,01280720,2)]
。不要使用dict
,FILAS={}
而使用FILAS[\u-ROI[4]]
等,不要使用eval
。如果你是一个初学者,基本上没有理由使用它。动态代码执行适用于那些正在做特殊事情的人,比如构建调试器等,除非你这样做,否则你的代码几乎肯定不会出现eval
或内省vars()
,globals()
,locals()
等问题,我认为,就是不能picklequeue.queue(maxsize=4)
对象。因为它们包含“\u thread.lock”
对象,这些对象是不可勾选的,并且多处理使用pickle
进行进程间通信。