python减少从队列中提取项时在内存中使用的空间
在我的程序启动生产者线程和消费者线程时,所有线程都会在共享队列对象中拾取和插入元素,并保留对它的引用 我知道当您不再有对对象的引用时,垃圾收集器会清理内存,但我的问题是另一个问题,因为我必须保留对队列的引用才能继续插入或删除项 启动程序时,我注意到当我在队列中插入一个元素时,分配给队列的内存空间会随着队列的长度而增长,而当我从队列中取出一个元素时,它的大小会减小,而分配给队列的内存空间不会减小,有没有办法也减小内存空间? 有了这个问题,为每个插入的元素分配的内存将继续增长,直到它占用所有可用内存 更新 经过一些研究,我发现这似乎是一个非常类似于我的问题 还建议创建一个新的队列和交换,我如何才能有效地做到这一点 我的代码示例 主线程创建进程队列并启动线程python减少从队列中提取项时在内存中使用的空间,python,multithreading,memory-management,memory-leaks,queue,Python,Multithreading,Memory Management,Memory Leaks,Queue,在我的程序启动生产者线程和消费者线程时,所有线程都会在共享队列对象中拾取和插入元素,并保留对它的引用 我知道当您不再有对对象的引用时,垃圾收集器会清理内存,但我的问题是另一个问题,因为我必须保留对队列的引用才能继续插入或删除项 启动程序时,我注意到当我在队列中插入一个元素时,分配给队列的内存空间会随着队列的长度而增长,而当我从队列中取出一个元素时,它的大小会减小,而分配给队列的内存空间不会减小,有没有办法也减小内存空间? 有了这个问题,为每个插入的元素分配的内存将继续增长,直到它占用所有可用内存
#this is the main thread
import queue
process_queue = ProcessQueue()
#main thread starts StartProcessThread and SendingThread, passes process_queue as param
处理队列
class ProcessQueue():
def __init__(self):
self.q = queue.Queue()
def put(self,elem):
self.q.put(elem)
def get(self):
elem = self.q.get()
temp = queue.Queue()
#swap queue
return elem
def task_done(self):
self.q.task_done()
启动进程线程
class StartProcessThread(Thread):
def __init__(self, process_queue):
super().__init__()
self.process_queue = process_queue
#some vars
#some methods
def start_download(self, name):
try:
#starts a process
process = Popen(
["path", "params"])
except Exception as e:
return False
process_list = [process, name]
self.process_queue.put(process_list)
return True
def task(self, url, name):
#something
if self.start_download(name):
#something
return True
else:
return False
def run(self):
# threadpoolexecutor
executor = ThreadPoolExecutor(max_workers=3)
while True:
strm = #get something from db
if str:
executor.submit(self.task, (url))
else:
sleep(10)
发送线程
class SendingThread(Thread):
def __init__(self,process_queue):
super(SendingThread, self).__init__()
self.process_queue = process_queue
def get_process(self):
process = self.process_queue.get()
poll = process[0].poll()
# if poll == none process still alive
if poll is not None:
return process
self.process_queue.put(process)
return []
def run(self):
while True:
process = self.get_process()
if process:
# do something
我认为,如果你想在这样的规模上寻找内存效率,Python不是一条可行之路?另一方面,像您在这里一样使用
Exception作为e:
是不好的做法。例如,请参见:,。@AMC经过一些研究,我发现这里似乎有一个问题与我的问题非常相似,因此可以在那里找到最小的可重复性示例,也可以在他们建议创建一个新队列并交换它的答案中找到,那么我如何有效地交换队列?我将很快更新帖子