排他的ロックをしてるのに、1 プロセスより 2 プロセスのほうが速い?
ところで、<<476 のコードを改造して実験してみたとき、よくわからん現象に見舞われた。1 プロセスだと 1 分近くかかるのに、2 プロセスだと 15 秒で終わってしまうのだ。
コード (hoge.py):
#!/usr/bin/env python N = 100000 filename = 'count-file' from fcntl import flock, LOCK_EX, LOCK_UN for i in xrange(N): f = open(filename, 'r+') flock(f.fileno(), LOCK_EX) s = f.readline() cnt = s and int(s) + 1 or 1 f.seek(0) f.write(str(cnt)) #flock(f.fileno(), LOCK_UN) f.close()
1 プロセスで実験:
$ echo 0 > count-file $ time python hoge.py real 0m52.042s user 0m5.929s sys 0m7.689s $ cat count-file 100000
2 プロセスで実験:
$ echo 0 > count-file $ time python hoge.py & [1] 15324 $ time python hoge.py real 0m15.742s user 0m3.983s sys 0m5.387s [1]+ Done time python hoge2.py real 0m15.250s user 0m7.940s sys 0m10.725s $ cat count-file 200000
1 プロセスだと 52 秒かかるのに、2 プロセスだと各々 15 秒で済んでいる。このスクリプトは処理を分散するタイプではなく、排他的にロックを獲得しないといけないから、プロセスが増える方が実行時間は増えるはずなのに、結果はまったく逆になった。
さっぱり意味がわからん。誰か原理を教えてください。
環境は MacOS X 10.4 Tiger, Intel CoreDuo 1.83GHz, Python 2.5.2 です。