2016-12-16 8 views
0

Я сотни коробки могут быть доступны только с другой шлюз, как ниже показано:Как передать env.host в ткань при использовании многопроцессорной обработки?

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

Все работы нужно сделать в течение одной минуты, поэтому я использую многопроцессном ниже команды fab -f ytj_sto.py doitnow, ошибки ниже.

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

Код:

@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 решить проблему, спасибо всем

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 d принимает значения env, установленные вами во время выполнения. Но, к сожалению, поскольку fabric не полностью потокобезопасен, вы можете запускать подобные задачи параллельно в вашей ситуации один раз на один шлюз, потому что env является глобальным синглом.

Простой, но неотъемлемый аспект ткани является то, что известно как «окружающей средой» : словарю 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

Я думаю, вы можете просто поставить env к coll как параметр:

@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.

Однако глобальные переменные, являющиеся просто константами уровня модуля, не создают проблем.