Подтвердить что ты не робот

Динамические хосты и параллельные задачи с библиотекой 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, но я хочу, чтобы task_2 запускался на узлах, которые удовлетворяют условию в task_1. Похоже, что при запуске инициализируется список хостов task_2, поскольку он выполняется на всех хостах в начальном env.hosts списке, определенном в init_hosts(). Я также пытался динамически модифицировать и строить roledefs, но имел тот же результат.

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

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

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)

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

4b9b3361

Ответ 1

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

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