我在 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
关于在文件系统中搜索“随机”的所有垃圾是怎么回事?我真的想避免这种情况,因为我在集群上并行运行了很多具有这种结构的进程,并且循环非常快,并且这种文件系统活动阻塞了文件系统元数据服务器,或者集群管理员告诉我.
如果我删除“import scipy”命令,那么这个问题就会消失:
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,
实际上,因为我刚刚意识到它可能取决于系统,所以我在笔记本电脑上运行了相同的代码并且没有问题(即输出相当于第二种情况)。在我正在运行的笔记本电脑上
python:2.6.5,多处理:0.70a1,scipy:0.10.0,
也许这是已修复的早期版本的 scipy 中的问题或错误?我对这样的任何东西的搜索都没有出现。即使这是问题所在,在集群上更改 scipy 的版本也不是那么容易,尽管如果需要,我可能可以让集群管理员构建更新的版本。
这可能是问题吗?