Python 队列最大大小5不适用于线程

Python 队列最大大小5不适用于线程,python,multithreading,Python,Multithreading,我正在编写一个python类,它使用队列和线程来限制执行时间,同时保持较低的CPU使用率。我正在创建多个线程,给定调用相同函数的不同参数。这些函数包含需要同步的数据,因此使用了锁,但每个线程还需要执行并返回不同的结果。队列大小为5,迭代之间的队列ID相同,但是队列从不在5阻塞以等待下一个可用插槽 没有可用的解决方法 !/usr/bin/python 导入操作系统 导入系统 导入线程 将队列作为队列导入 导入子流程 类别myClass: 列表=[] lock=threading.RLock q=q

我正在编写一个python类,它使用队列和线程来限制执行时间,同时保持较低的CPU使用率。我正在创建多个线程,给定调用相同函数的不同参数。这些函数包含需要同步的数据,因此使用了锁,但每个线程还需要执行并返回不同的结果。队列大小为5,迭代之间的队列ID相同,但是队列从不在5阻塞以等待下一个可用插槽

没有可用的解决方法

!/usr/bin/python 导入操作系统 导入系统 导入线程 将队列作为队列导入 导入子流程 类别myClass: 列表=[] lock=threading.RLock q=queue.Queuemaxsize=5 定义初始自我: self.threads=[] 自检=设置 def find_certsself,容器: cmd=docker exec{}-find/-name'*.pem'-o-name'*.cer'.formatcontainer certs=subprocess.callcmd 返回证书 def cat_证书自身、容器、证书: self.certs_list=[] self.certs\u list.appendList所有路径…\n 对于证书中的路径: path=os.path.abspathpath cmd=docker exec{}-cat{}.formatcontainer,路径 self.certs_list=subprocess.callcmd self.certs\u list=.joinself.certs\u list 使用myClass.lock: myClass.list.appendself.certs\u列表 def reportself,容器: myClass.q.get 证书=self.find\u certscontainer 如果证书: 证书=.joincertificates 证书=证书。拆分\n 证书=ListFilterOne,证书 self.cat_证书容器、证书 myClass.q.任务完成 def runself: 容器=[c1、c2、c3、c4、c5、c1、c6、c7、c8、c2] 对于集装箱中的集装箱: 如果容器未处于自检状态: self.checked.addcontainer 线程=线程。线程 target=self.report,args= 容器 self.threads.appendthread myClass.q.putcontainer thread.start printQueue现在有{}个任务\n.formatmyClass.q.qsize myClass.q.join printmyClass.list def主: c=myClass c、 跑 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 主要的 预期的结果是将5个项目放入队列并创建5个线程,然后等待插槽再次空闲。队列首先应执行第一个线程,每个线程将具有不同数量的证书,最后应将它们全部打印为块

现在,它从不阻塞队列的最大大小,甚至不会达到3。
在所有迭代中,队列表示它有1个任务。这可能是因为myClass.q未同步吗?

您似乎正在尝试同步生产者线程和消费者线程


参见

Re,while not lock.acquire:继续此处的while有什么意义?lock.acquire在没有参数的情况下调用时总是返回True。Re,if not certificates:pass else。。。也有点奇怪。为什么不扔掉“不”和“通行证”以及其他东西呢?如中所示,if certificates:…Re,它进入find_certs函数,但从不返回,这是一个非常简单的函数。如果没有返回,这可能意味着docker命令从未终止。你试过使用假命令吗您可以确定会返回值的内容?@SolomonSlow感谢您提供的信息,我没有意识到我会将其更改为带锁。获取:Ans如果没有证书:部分也将更新。docker命令需要一些时间,但会终止。我不确定队列连接是否正确,或者在循环中使用q.put是否会导致任何问题。最重要的是,它甚至没有为队列的前5个插槽保留线程。cat_证书和find_证书是否需要修饰?有没有可能他们弄乱了并行性的值?这是一个非常好的URL,但没有解决我的问题,实际上问题是线程中的队列在每个线程中是不同的。