2016-12-16 6 views
0

Ich habe Hunderte von Box kann nur mit unterschiedlichen Gateway zugegriffen werden, wie unten zeigt:Wie wird env.host an Fabric übertragen, wenn Multiprocessing verwendet wird?

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

Alle Jobs in einer Minute erledigt brauchen, so dass ich mit Multi-Prozess unter Befehl fab -f ytj_sto.py doitnow, unten Fehler.

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

Code:

@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() 

EDITED: Ich habe fab -H verwendet -g das Problem gelöst, dank all

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

Wo wird das Gewebe Aufgabe ('patt') Sie anrufen möchten? Und wie haben Sie '_is_ssh_ok' implementiert? – 2ps

Antwort

1

Wenn Sie env-Variablen dynamisch wie Sie festlegen möchten, sollten Sie execute verwenden. Auf diese Weise übernimmt der Task execute die env Werte, die Sie zur Laufzeit festlegen. Aber leider, weil fabric nicht vollständig threadsicher ist, können Sie Tasks wie diese in Ihrer Situation nur einmal pro Gateway starten, da env ein globaler Singleton ist.

Ein einfacher, aber integraler Bestandteil des Stoffes ist, was als die „Umwelt“ bekannt ist: eine Python-Wörterbuch Unterklasse, die als Kombination Registrierungseinstellungen verwendet wird, und Inter-Task-Daten-Namensraum geteilt.

Das Umgebungsdikt ist derzeit als globaler Singleton implementiert, fabric.state.env, und ist in fabric.api zur Vereinfachung enthalten. Die Tasten in env werden manchmal als "env-Variablen" bezeichnet.

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

Ich glaube, Sie nur env an die coll liefern kann Funktion als Parameter, so:

@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() 

Es gibt ein paar Macken zur Verwendung der multiprocessing library. Diese Informationen könnten besonders relevant sein, um Sie Szenario:

Globale Variablen

Beachten Sie, dass, wenn Code laufen in einem untergeordneten Prozess eine globale Variable zuzugreifen versucht, dann wird der Wert es (falls vorhanden) sieht kann nicht identisch mit dem Wert im übergeordneten Prozess zum Zeitpunkt des Aufrufs von Process.start.

Jedoch verursachen globale Variablen, die nur Modulniveaukonstanten sind, keine Probleme.

Verwandte Themen