【发布时间】:2017-02-17 00:42:29
【问题描述】:
我有以下脚本:
#!/usr/bin/env python3
import os
i = 1
while i != 255:
Test = os.system("ping -c 1 10.0.0." + str(i) + " > /dev/null")
if Test == 0:
print("Host: 10.0.0." + str(i) + " is up!");
i = i + 1
else:
i = i + 1
这是一个类似 NMap 的 python 脚本,我无聊并决定制作。
无论如何,当我运行它时,它非常慢,但是当我按住 CTRL + C 时,它运行得更快......而且它有效!
有没有办法让这个脚本变得更快?
【问题讨论】:
-
multiprocessing将是一个开始的地方。顺便说一句,因为你的i保证是数字的,所以这里是安全的,但是通常使用字符串连接来形成 shell 命令是非常不安全的。将数组传递给subprocess.Popen(将>/dev/null重定向替换为不依赖于shell 的等价物,如stdout=open('/dev/null', 'wb'))是更好的形式。 -
当然它会“超级慢” - ping 潜在主机然后等待响应需要时间,并且执行 255 次。如果您的系统上有
nmap,您可以尝试使用:os.system("nmap -sP --max-retries=1 --host-timeout=500ms 10.0.0.{} > /dev/null".format(i)),而不是在 500 毫秒后放弃,但正如其他人建议的那样,如果您想让所有内容并行运行,则必须使用多处理。 -
@jersten, ...我不确定 GIL 在这里是否是个大问题,因为正在完成的工作正在等待子进程——等待本身应该在锁之外;只有在 SIGCHLD 进来时处理结果才应该严格要求持有锁。
-
我宁愿避免使用NMap,我正在制作的程序应该像NMap,但更精简