Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Memory Management_Memory Leaks_Queue - Fatal编程技术网

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经过一些研究,我发现这里似乎有一个问题与我的问题非常相似,因此可以在那里找到最小的可重复性示例,也可以在他们建议创建一个新队列并交换它的答案中找到,那么我如何有效地交换队列?我将很快更新帖子