私はPythonでいくつかの極端な奇妙な振る舞いを観察しています。次のコードを検討してください。
from multiprocessing import Process
import scipy
def test():
pass
for i in range(1000):
p1 = Process(target=test)
p1.start()
p1.join()
print i
これに対してstrace-fを実行すると、ループから次のセグメントが取得されます。
clone(Process 19706 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b23afde1970) = 19706
[pid 19706] set_robust_list(0x2b23afde1980, 0x18) = 0
[pid 18673] wait4(19706, Process 18673 suspended
<unfinished ...>
[pid 19706] stat("/apps/python/2.7.1/lib/python2.7/multiprocessing/random", 0x7fff041fc150) = -1 ENOENT (No such file or directory)
[pid 19706] open("/apps/python/2.7.1/lib/python2.7/multiprocessing/random.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 19706] open("/apps/python/2.7.1/lib/python2.7/multiprocessing/randommodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 19706] open("/apps/python/2.7.1/lib/python2.7/multiprocessing/random.py", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 19706] open("/apps/python/2.7.1/lib/python2.7/multiprocessing/random.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 19706] open("/dev/urandom", O_RDONLY) = 3
[pid 19706] read(3, "\3\204g\362\260\324:]\337F0n\n\377\317\343", 16) = 16
[pid 19706] close(3) = 0
[pid 19706] open("/dev/null", O_RDONLY) = 3
[pid 19706] fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
[pid 19706] exit_group(0) = ?
Process 18673 resumed
Process 19706 detached
ファイルシステム内で「ランダム」を検索することについてのすべてのがらくたはどうですか?クラスター上でこの構造を使用して非常に多くのプロセスを並行して実行し、非常に高速にループしているため、これを避けたいと思います。この種のファイルシステムアクティビティは、ファイルシステムメタデータサーバーを詰まらせているため、クラスター管理者は私に教えてくれます。 。
「importscipy」コマンドを削除すると、この問題は解決します。
clone(Process 23081 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b42ec15e970) = 23081
[pid 23081] set_robust_list(0x2b42ec15e980, 0x18) = 0
[pid 22052] wait4(23081, Process 22052 suspended
<unfinished ...>
[pid 23081] open("/dev/null", O_RDONLY) = 3
[pid 23081] fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
[pid 23081] exit_group(0) = ?
Process 22052 resumed
Process 23081 detached
しかし、実際のコードにはscipyが必要なので、それを取り除くことはできません。または多分私はできますが、それは苦痛でしょう。
なぜ私がこの振る舞いを見ているのか誰かが知っていますか?それが私が実行している何かのいくつかのバージョンの癖である場合:
python:2.7.1、マルチプロセッシング:0.70a1、scipy:0.9.0、
実際、システムに依存している可能性があることに気付いたので、ラップトップで同じコードを実行し、問題はありませんでした(つまり、2番目のケースと同等の出力)。私が実行しているラップトップで
python:2.6.5、マルチプロセッシング:0.70a1、scipy:0.10.0、
おそらく、修正されたのは以前のバージョンのscipyの問題またはバグですか?このようなものを検索しても何も見つかりませんでした。それが問題であるとしても、クラスター上のscipyのバージョンを変更するのはそれほど簡単ではありませんが、必要に応じてクラスター管理者に新しいバージョンをビルドさせることはおそらく可能です。
これが問題になる可能性がありますか?