😽
Python の ThreadPoolExecutor に submit しまくるとメモリ消費が多くなる
submit したものはキューとして扱われるらしいので、キューしまくればメモリ消費は多くなります。それはそう。
環境
python 3.4
メモリ消費を計測するために psutil をインストールしておく。
% pip3 install psutil
コード
以下のような何もしない job
をただひたすら submit します。
import time
import threading
from concurrent.futures import ThreadPoolExecutor
KB = 1024
MB = KB * 1024
def _print_memory_info():
import os, psutil
process = psutil.Process(os.getpid())
print("rss {} vms {}".format(process.memory_info().rss / MB, process.memory_info().vms / MB))
def job(t):
return t
_print_memory_info()
futures = []
with ThreadPoolExecutor(max_workers=2) as executor:
futures = [executor.submit(job, i) for i in range(100000)]
_print_memory_info()
result = [f.result() for f in futures]
_print_memory_info()
計測
range
の値を 10 と 10 万にして計測してみました。range(10)
よりも range(100000)
のほうがメモリ消費が多いですね。
あと with ThreadPoolExecutor as executor
を抜けたからといってメモリが開放されるわけでもないようです。
range(10)
の場合
% python3 trythread.py
rss 11.04296875 vms 49.8515625
rss 11.04296875 vms 193.859375
rss 11.078125 vms 195.9453125
range(100000)
の場合
% python3 trythread.py
rss 11.0390625 vms 49.8515625
rss 178.98046875 vms 348.0234375
rss 179.87890625 vms 351.078125
Discussion