2016-12-16 11 views
0

私は以下のように、箱の数百人が異なるだけゲートウェイでアクセスすることができます持って示していますマルチプロセッシングを使用する場合、env.hostをファブリックに転送するにはどうすればよいですか?

gateway1:ip1,ip2 
gateway2:ip3,ip4 ... 

すべてのジョブは、1分間で行わ必要があるので、私は、コマンドfab -f ytj_sto.py doitnow、以下のエラー以下のマルチを使用します。

[] 
None 
None 
***Warning*** Host None via ssh is down 

コード:EDITED

@parallel(pool_size=20) 
def coll(): 
    print env.hosts 
    print env.host 
    print env.gateway 
    if _is_ssh_ok(env.host): 
     d = patt() 

def doitnow(): 
    p=Pool(20) 
    with open('ytj_sto.hn','r') as f: 
     for line in f.readlines(): 
      line = line.strip() 
      if not len(line) or line.startswith('#'): 
       continue 
      env.gateway = line.split(':')[0] 
      env.hosts = line.split(':')[1].split(',') 
      result = p.apply_async(coll, args=()) 
      result.get() 
    p.close() 
    p.join() 

: 私は問題を解決-gファブ-Hを使用していた、おかげですべての

def fabfun(Hosts,Gate,des,func1): 
     with settings(hide('running'), warn_only=True): 
      local(("fab -H %s -g %s -f %s %s ") % (Hosts,Gate,des,func1)) 

p=Pool(20) 
starttime = time.asctime(time.localtime(time.time())) 
print('Waiting for all job done...%s' % starttime) 
with open('ytj_sto.hn','r') as f: 
    for line in f.readlines(): 
     line = line.strip() 
     if not len(line) or line.startswith('#'): 
      continue 
     Hosts = line.split(':')[1] 
     Gate = line.split(':')[0] 
     p.apply_async(fabfun, args=(Hosts,Gate,des,func1)) 
    p.close() 
    p.join() 
+0

ここで、コールしようとしているファブリックタスク(「patt」)はありますか?そして '_is_ssh_ok'をどのように実装しましたか? – 2ps

答えて

1

env変数を動的に設定する場合は、executeを使用してください。そうすれば、executeタスクは実行時に設定したenvの値をとります。しかし、残念ながら、fabricは完全にスレッドセーフではないため、envはグローバルシングルトンであるため、ゲートウェイごとに1回だけ状況に応じてこのようなタスクを並列に開始できます。 コンビネーションの設定レジストリと共有タスク間のデータの名前空間として使用されているPythonの辞書のサブクラスで、:ファブリックの

単純ではあるが不可欠な側面は 「環境」として知られているものです。

環境ディクテーションは現在、グローバルシングルトンの fabric.state.envとして実装されており、便宜上fabric.apiに含まれています。 env内のキー は、「env変数」と呼ばれることがあります。

from fabric.context_managers import env 

@parallel(pool_size=20) 
def check_and_patt(): 
    if _is_ssh_ok(env.host): 
     d = patt() 

def doitnow(): 
    p=Pool(20) 
    with open('ytj_sto.hn','r') as f: 
     for line in f.readlines(): 
      line = line.strip() 
      if not len(line) or line.startswith('#'): 
       continue 
      env.gateway = line.split(':')[0] 
      env.hosts = line.split(':')[1].split(',') 
      result = execute(check_and_patt) 
0

私はあなただけcollenvを供給することができると思います次のようにパラメータとして機能します。

@parallel(pool_size=20) 
def coll(env): # <-- updated 
    print env.hosts 
    print env.host 
    print env.gateway 
    if _is_ssh_ok(env.host): 
     d = patt() 

def doitnow(): 
    p=Pool(20) 
    with open('ytj_sto.hn','r') as f: 
     for line in f.readlines(): 
      line = line.strip() 
      if not len(line) or line.startswith('#'): 
       continue 
      env.gateway = line.split(':')[0] 
      env.hosts = line.split(':')[1].split(',') 
      result = p.apply_async(coll, args=(env,)) # <-- updated 
      result.get() 
    p.close() 
    p.join() 

multiprocessing libraryの使用にはいくつかの癖があります。 (もしあれば)子プロセス内のコードの実行がグローバル変数にアクセスしようとする場合、その値は、それが見ていることを念頭に置いて

グローバル変数

ベア:この情報は、あなたのシナリオに特に関連があるかもしれませんProcess.startが呼び出された時点の親プロセスの値と同じではありません。

しかし、モジュールレベルの定数であるグローバル変数は問題にはなりません。

関連する問題