😽

Python の ThreadPoolExecutor に submit しまくるとメモリ消費が多くなる

2021/04/07に公開

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