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 |