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)