12

複数の並列タスク間でホストを動的に変更する方法はありますか? これは私がこれまでに持っているものです。

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のみ実行したいと考えています。で定義された初期リスト内のすべてのホストで実行されているため、 のホスト リストは起動時に初期化されているようです。また、roledef を動的に変更して構築しようとしましたが、同じ結果になりました。task_2task_1task_2env.hostsinit_hosts()

編集:また、複数の並列タスクが順次ではなく並列に実行されるように、並列実行キューを設定する方法はありますか?

編集:各タスクに出力を返させ、出力を解析して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)

これは機能しますが、多くの理由でひどいものです。より良い方法はありますか?

4

1 に答える 1

3

並列実行はフォークを使用するため、状態の変更を共有 (戻る) しません。したがって、並行して実行されている 1 つのタスクで env 変数を変更しても、実行中のそのタスクの他のインスタンスには影響せず、呼び出される前にグローバルに設定されたものも変更されません。

task_1 が実行しているのはすべてチェックである場合、このロジックを task_2 に組み込んでみませんか?

于 2012-05-15T19:54:26.627 に答える