【发布时间】:2017-03-22 14:28:36
【问题描述】:
我有一个简单的 fabfile 名称 env_fabfile.py
# env_fabfile.py
# makes use of fab env variables
from fabric.api import env, run
def login():
env.hosts = ['user@host1:1234', 'user@host2:2345']
env.passwords = {'user@host1:1234': 'pass1', 'user@host2:2345': 'pass2'}
env.parallel=True
def run_lsb_release():
run('lsb_release -a')
现在我使用 fab 命令运行上述代码:
fab -f env_fabfile.py login run_lsb_release
它完美运行(并行)并提供所需的输出
现在我想实际计算同一脚本串行运行与并行运行之间的时间差。为此,我编写了以下 python 脚本: timecal.py
# timecal.py
# runs the fabfile once in serial and calculates the time
# then runs the same file in parallel and calculates the time
from fabric.api import env, run
import time
def login():
print "in login"
env.hosts = ['user@host1:1234', 'user@host2:2345']
env.passwords = {'user@host1:1234': 'pass1', 'user@host2:2345': 'pass2'}
def parallel(status):
print "in parallel"
env.parallel=status
def run_lsb_release():
print "in run"
run('lsb_release -a')
def do_serial():
start_time = time.time()
parallel(False)
login()
run_lsb_release()
elapsed_time = time.time() - start_time
return elapsed_time
def do_parallel():
start_time = time.time()
parallel(True)
login()
run_lsb_release()
elapsed_time = time.time() - start_time
return elapsed_time
if __name__ == '__main__':
print "Running in serial mode "
print "Total time taken ", do_serial()
print "Running in parallel mode"
print "Total time taken ", do_parallel()
但是当我运行 timecal.py 作为
python timecal.py
我在标准输出上得到以下信息(除了代码中的打印语句)
未找到主机。请指定(单个)主机字符串进行连接:
我不明白为什么?另外如何纠正脚本以便我可以实现我想要的(如上面的问题所述)
如果我尝试不同版本的 timecal.py,如:
from fabric.api import run, settings, env
import time
def do_parallel():
start_time = time.time()
env.hosts = ['user@host1:1234', 'user@host2:2345']
env.passwords = {'user@host1:1234': 'pass1', 'user@host2:2345': 'pass2'}
env.parallel=True
run('lsb_release -a')
elapsed_time = time.time() - start_time
return elapsed_time
def do_serial():
start_time = time.time()
with settings(host_string='host1', port=1234, user='user', password='pass1'):
run('lsb_release -a')
with settings(host_string='host2', port=2345, user='user', password='pass2'):
run('lsb_release -a')
elapsed_time = time.time() - start_time
return elapsed_time
if __name__ == '__main__':
try:
print "Running in parallel mode"
print "Total time taken ", do_parallel()
print "Running in serial mode "
print "Total time taken ", do_serial()
except Exception as e:
print e
我收到以下错误:
致命错误:需要提示输入目标主机连接字符串(主机:无),但在并行模式下输入会不明确
我不明白为什么主机:这里没有?代码有什么问题?
【问题讨论】:
标签: python parallel-processing fabric