import threading
import time
class T(threading.Thread):
    def run(self):
        time.sleep(10)
def main():
    ts = []
    for i in xrange(100):
        t = T()
        t.start()
        ts.append(t)
    for t in ts:
        t.join()
if __name__ == r"__main__":
    main()
というような、超シンプルな物を作ってみた。
しかし、ダメであった。
仮想メモリを808Mも消費している。
Pythonのthreadは使えないのか、ということで、Cで試してみた。
#include <stdio.h>
#include <pthread.h>
void mysleep()
{
    sleep(10);
}
main()
{
    pthread_t thread[100];
    int i;
    int ret;
    for (i = 0; i < 100; i++) {
        pthread_create(&thread[i], 0,
                        (void *)&mysleep, NULL);
    }
    for (i = 0; i < 100; i++) {
        pthread_join(thread[i], NULL);
    }
    sleep(15);
}
しかし、これもダメであった。
801Mも消費している。
Pythonは悪くなかった。
どちらも、800M位になるので、thread 1つあたり8Mという数値に何か秘密がありそうだ。
で、いろいろ、調べてみると、この8Mというのは、stackのサイズであることが判明した。
% limit stacksize
stacksize    8192 kbytes
ということで、limit (bashの人はulimit)でstacksizeを小さくして実行すると、それにあわせて小さくなった。
(あまり小さくすると、core吐いたけど・・・。)
ということで、threadを大量にあげるときはstackを小さくしましょう。 合ってる?!
・200コもスレッドを作るやつがいるとは思ってなかったんじゃろね [2007/5/3 00:01:39] (by 百舌鳥)
| ひらの | yo@hirano.cc |