# test.py
import threading
import time
import random
from itertools import count
def fib(n):
"""fibonacci sequence
"""
if n < 2:
return n
else:
return fib(n - 1) + fib(n - 2)
if __name__ == '__main__':
counter = count(1)
start_time = time.time()
def thread_worker():
while True:
try:
# To simulate downloading
time.sleep(random.randint(5, 10))
# To simulate doing some process, will take about 0.14 ~ 0.63 second
fib(n=random.randint(28, 31))
finally:
finished_number = counter.next()
print 'Has finished %d, the average speed is %f per second.' % (finished_number, finished_number/(time.time() - start_time))
threads = [threading.Thread(target=thread_worker) for i in range(100)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
上記は私のテストスクリプトです。thread_worker 関数は、1 回の実行に最大 10.63 秒かかります。100 スレッドを開始したところ、結果は 1 秒あたり最大 10 回になると予想されました。しかし、実際の結果は次のように苛立たしいものでした。
...
Has finished 839, the average speed is 1.385970 per second.
Has finished 840, the average speed is 1.386356 per second.
Has finished 841, the average speed is 1.387525 per second.
...
そして、「fib(n=random.randint(28, 31))」をコメントアウトすると、結果が期待されます。
...
Has finished 1026, the average speed is 12.982740 per second.
Has finished 1027, the average speed is 12.995230 per second.
Has finished 1028, the average speed is 13.007719 per second.
...
1029 を終了しました。平均速度は 1 秒あたり 12.860571 です。
私の質問は、なぜそんなに遅いのですか?私は毎秒〜10を期待していました。速くする方法は?fib() 関数は、何らかのプロセスの実行をシミュレートするためのものです。たとえば、大きな html からデータを抽出します。