Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中动态启动各种进程_Python_Multithreading_Process - Fatal编程技术网

在Python中动态启动各种进程

在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

我想在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()
类别/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()
等问题,我认为,就是不能pickle
queue.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()
等问题,我认为,就是不能pickle
queue.queue(maxsize=4)
对象。因为它们包含
“\u thread.lock”
对象,这些对象是不可勾选的,并且多处理使用
pickle
进行进程间通信。