2012-05-15 18 views
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') 

जाहिर है मैं करता है, जिन्हें task_1 में हालत को संतुष्ट पर चलने के लिए कुछ env paramenters याद कर रहा हूँ, लेकिन मैं केवल चाहते task_2। ऐसा लगता है कि task_2 की होस्ट सूची स्टार्टअप पर शुरू की गई है, क्योंकि यह init_hosts() में परिभाषित प्रारंभिक env.hosts सूची में सभी होस्टों पर चल रही है। मैंने गतिशील रूप से संशोधित और रोल्डेफ बनाने का भी प्रयास किया, लेकिन इसका एक ही परिणाम था।

संपादित करें: साथ ही, समानांतर निष्पादन कतार स्थापित करने का कोई तरीका है जैसे कि समानांतर में समानांतर में एकाधिक समानांतर कार्य निष्पादित किए जाते हैं?

संपादित करें: मैं प्रत्येक कार्य वापसी उत्पादन होने, और उत्पादन को पार्स एक नया मेजबान सूची बनाने के लिए के आधार पर अपने वांछित अंतिम परिणाम प्राप्त करने के लिए निष्पादित करने के लिए() पारित करने में कामयाब रहे:

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) 

यह काम करता है, लेकिन यह है कई कारणों से सकल क्या कोई बेहतर तरीका है?

उत्तर

3

समांतर निष्पादन कांटे का उपयोग करता है, और इस तरह राज्य परिवर्तनों को वापस (पीछे) साझा नहीं करता है। तो समानांतर में चल रहे एक कार्य में एक env वैरिएबल को बदलना, उस कार्य के किसी भी अन्य उदाहरण को प्रभावित नहीं करता है, और न ही इसे कॉल करने से पहले वैश्विक रूप से सेट किया जाता है।

यदि सभी कार्यस्थान कभी भी एक जांच कर रहा है, तो क्यों न केवल इस तर्क को task_2 में शामिल करें?

संबंधित मुद्दे