zoukankan      html  css  js  c++  java
  • python ThreadPoolExecutor使用后内存不断消耗内存解决

    from functools import wraps
    import concurrent.futures
    import time
    
    
    def test_func(func):
        @wraps(func)
        def inner(*args, **kwargs):
            print ("start...")
            res = func(*args, **kwargs)
            print ("end...")
            return res
        return inner
    
    @test_func
    def test1():
        print ('run test1 ....')
        time.sleep(10)
    
        return 1
    
    @test_func
    def test2():
        print ('run test2 ....')
        time.sleep(10)
    
        return 1
    
    @test_func
    def test3():
        print ('run test3 ....')
        time.sleep(10)
    
        return 1
    
    @test_func
    def test4():
        print ('run test4 ....')
        time.sleep(10)
    
        return 1
    
    
    
    def main():
    
        funcs = [test1, test2, test3, test4]
    
        executor = concurrent.futures.ThreadPoolExecutor(4)
         while True:
                 for func in funcs:
                        executor.submit(func)
                 print executor._work_queue.qsize()
    

    通过运行代码能发现在调用该程序之后,内存直线上升;在循环调用线程池时,进程会不断的往线程池中扔任务,而不会判断,等待线程池中是否存在空闲线程程;

    解决方法

    既然线程池使用的为无界队列,那么就可以将类重写,并使用有界队列,如:

    import queue
    from concurrent.futures import ThreadPoolExecutor
    
    class BoundThreadPollExecutor(ThreadPoolExecutor):
        def __init__(self, *args, **kwargs):
            super(BoundThreadPollExecutor, self).__init__(*args, **kwargs)
            self._work_queue = queue.Queue(4) 
  • 相关阅读:
    统计插件无效问题
    Hearthbuddy跳过ConfigurationWindow窗口
    炉石兄弟更新修复记录(至2021年5月)
    HearthbuddyHelper已经开源
    2020年8月28日
    交易机制的实现
    Silverfish重构【2】-限制惩罚为某一behavior特有
    Silverfish重构【1】-发现卡牌的函数
    99-Flagstone Walk
    Behavior控场模式的解析(下)
  • 原文地址:https://www.cnblogs.com/honglingjin/p/13652661.html
Copyright © 2011-2022 走看看