2012-05-15 1 views
12

Есть ли способ динамически изменять хосты между несколькими параллельными задачами? Это то, что у меня есть до сих пор.Динамические хосты и параллельные задачи с библиотекой Fabric

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     env.hosts.remove(env.host) 

@parallel 
def task_2(): 
    run('uname -s') 

Очевидно, что я пропускаю некоторые env Paramenters, но я только хочу task_2 работать на хостах, которые удовлетворяют условию task_1. Похоже, что начальный список task_2 инициализируется при запуске, поскольку он запущен на всех хостах в начальном env.hosts списке, определенном в init_hosts(). Я также пытался динамически модифицировать и строить roledefs, но имел тот же результат.

Редактировать: Также есть способ настроить параллельную очередь выполнения таким образом, чтобы несколько параллельных задач выполнялись параллельно, а не последовательно?

Edit: мне удалось получить свой желаемый конечный результат, имея каждую задачу возвратного выхода, и синтаксический анализ вывода, чтобы построить новый список хостов перейти на выполнение():

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     return False 
    else: 
     return True 

@parallel 
def task_2(): 
    run('uname -s') 

def run_tests(): 
    results = execute(task_1) 
    successful_hosts = [k for k in results.iterkeys() if results[k]] 
    execute(test_2, hosts=successful_hosts) 

Это работает, но это брутто по многим причинам. Есть ли способ лучше?

ответ

3

Параллельное выполнение использует вилки и, как таковые, не делит (обратно) изменения состояния. Таким образом, изменение переменной env в одной задаче, выполняемой параллельно, не влияет на какой-либо другой экземпляр этой задачи и не изменяет ничего глобально, установленного до его вызова.

Если все task_1 делает, это проверка, почему бы просто не включить эту логику в task_2?

Смежные вопросы