2011-07-12 17 views
5

निम्न स्क्रिप्ट का एक साथ कई कार्यों को निष्पादित करने का उद्देश्य है, लेकिन मुझे नहीं पता कि यह सही तरीके से क्यों काम नहीं कर रहा है।
फ़ंक्शन अनुक्रमिक तरीके से निष्पादित किए जाते हैं, समानांतर नहीं।कई कार्यों को एक साथ निष्पादित करने के लिए ग्रीनलेट का उपयोग करने में समस्या

मैं स्पष्ट करने के लिए किसी भी सुझाव की सराहना करता हूं, मैं क्या गलत कर रहा हूं।

import time 
import eventlet 


EXECUTION_TIMEOUT = 10 

def example(name, steps_limit): 
    print 'Starting process %s with %d steps' % (name, steps_limit) 
    for i in range(1, steps_limit+1): 
     print "Process %s, step %d" % (name, i) 
     time.sleep(2) 
    print 'Finishing process %s with %d steps' % (name, steps_limit) 


def fetch(input_data): 
    example(input_data['name'], input_data['steps']) 

test_data = [{'name':'proceso1', 'steps':3}, 
      {'name':'proceso2', 'steps':5}, 
      {'name':'proceso3', 'steps':6}, 
      ] 

def main(): 
    #Setting up time out 
    timeout = eventlet.timeout.Timeout(EXECUTION_TIMEOUT) 
    #initialize pool 
    pool = eventlet.GreenPool(size=1000) 
    try: 
     for hits in pool.imap(fetch, test_data): 
      pass 
    except eventlet.Timeout: 
     print 'Operation interrupted by timeout concept' 
    finally: 
     timeout.cancel() 


if __name__ == '__main__': 
    main() 
+0

कृपया आपके द्वारा प्राप्त किए जा रहे किसी भी त्रुटि संदेश को शामिल करें, और जो भी हो रहा है उसके बारे में अधिक विशिष्ट हो। क्या यह तुरंत वापस आता है? क्या यह हमेशा के लिए लटका है? आपने इसे ठीक करने की क्या कोशिश की है? – TorelTwiddler

+0

त्रुटि संदेश नहीं है, यह हमेशा के लिए नहीं लटका है। समस्या यह है कि प्रक्रिया अनुक्रमिक तरीके से होती है, न कि अनियंत्रित। प्रत्येक कार्य शुरू होता है, जब पिछला समाप्त होता है। मुझे यह नहीं चाहिए। – rmaceissoft

+1

मुझे पहले से ही पता है कि मेरी त्रुटि क्या है। मैं "eventlet.sleep" के बजाय "time.sleep" का उपयोग कर रहा हूं। अंतर यह है कि अंतिम पूरे दुभाषिया को अवरुद्ध नहीं करता है और इस प्रकार अन्य ग्रीनलेट्स को उनके अनुरोधों के साथ आगे बढ़ने देता है। इस समय के लिए मेरे लिए धन्यवाद; -) .... और मुझे उम्मीद है कि यह डमी प्रश्न दूसरों को मदद करता है .... – rmaceissoft

उत्तर

2

आप अपराधी होने के बारे में time.sleep() सही हैं।

लेकिन आपको को eventlet.sleep() के साथ प्रतिस्थापित करने की आवश्यकता नहीं है। इसके बजाय, आप eventlet.sleep बनने के लिए बंदर पैच time.sleep कर सकते हैं।

यह वास्तव में पसंदीदा है, क्योंकि जिस तरह से पुस्तकालयों को आप नहीं जानते थे time.sleep भी तय हो जाते हैं, जबकि यदि आप इसे स्वयं ठीक करते हैं तो आपने केवल अपना कोड तय कर लिया है।

इस कारण से, gevent में, हम बस सभी कार्यक्रमों के लिए gevent.monkey.patch_all() कॉल करने के लिए सलाह देते हैं। घटना में, एक समान कार्य मौजूद है।

+0

आपके मूल्यवान स्पष्टीकरण के लिए धन्यवाद। शाम के साथ, आप का उपयोग कर एक ही प्रभाव मिलता है। eventlet.monkey_patch() यहां तक ​​कि, आप निर्दिष्ट कर सकते हैं कि आप कौन सा मॉड्यूल बंदर पैच चाहते हैं। उदाहरण के लिए, केवल बंदर पैच टाइम मॉड्यूल के लिए, eventlet.monkey_patch (time = True) – rmaceissoft

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

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