2013-06-02 4 views
10

इसके पीछे (इतना नहीं मैं स्वीकार करता हूं ...) हास्यास्पद प्रश्न एक वर्कअराउंड के बारे में एक वास्तविक सवाल है जिसका उपयोग मैं वास्तव में समझता हूं कि यह कैसे काम करता है।क्या होता है जब मैं गैस में "नींद" करता हूं? (निष्पादन समय सीमा वर्कअराउंड)

मैं बना सकते हैं और एक मेल मर्ज आवेदन में सौ दस्तावेजों के एक जोड़े ईमेल द्वारा भेज दिया:

सबसे पहले मेरी उपयोग के मामले का एक संक्षिप्त विवरण है, यह सब UiApp साइडबार में प्रदर्शित बाध्य एक दस्तावेज में हो रहा है जीएएस में लिखा है। यह पाठ्यक्रम लंबे समय तक भी 5 मिनट के निष्पादन समय सीमा तक पहुंच गए तो मैं कुछ अलग समाधान की कोशिश की कार्य करवाने के लिए बिना एक बैच में संसाधित करने के लिए की लेता है:

  1. एक समय स्टाम्प (ScriptProperties में संग्रहीत) का उपयोग करते हैं मैं प्रक्रिया शुरू करता हूं और जब मैं सीमा के पास एक पूर्वनिर्धारित मूल्य तक पहुंचता हूं तो मैं वर्तमान मान (पॉइंटर्स, उपयोगी वर्र्स ...) संग्रहीत करता हूं और उपयोगकर्ता इंटरफ़ेस पर वापस लौटने के लिए उपयोगकर्ता को जारी रखने के लिए लौटता हूं (या नहीं)। यह बहुत अच्छी तरह से काम करता है लेकिन पूरे कार्य को पूरा करने के लिए मानव कार्रवाई की आवश्यकता है।
  2. इसलिए मैंने टाइमर ट्रिगर का उपयोग करके एक समाधान स्थापित किया है जिसे मैंने पहले हैंडलर कॉल में बनाया है और यह ट्रिगर दस्तावेज़ निर्माण/प्रेषण समारोह को कॉल करता है। यह अच्छी तरह से काम कर रहा है लेकिन फ़ंक्शन नामक ट्रिगर यूआई के साथ बातचीत करने में सक्षम नहीं है क्योंकि ऐसा लगता है कि केवल हैंडलर फ़ंक्शन यूआई अपडेट कर सकते हैं। समस्या यह है कि प्रक्रिया प्रगति समाप्त होने पर मैं प्रगति नहीं दिखा सकता और न ही आसानी से दिखा सकता हूं।
  3. तब मुझे एक छोटा सा ऐप याद आया जो कुछ समय पहले बस मजेदार के लिए लिखा था: यह एक टाइमर था जो एक सर्वर हैंडलर ट्रिगर के रूप में चेकबॉक्स का उपयोग करता था (पुराने विचार पर रोमेन वायालार्ड द्वारा बहुत पहले सुझाए गए विचार से) और निर्णय लिया मेरे मेल भेजने की प्रक्रिया में इस चाल को आजमाने के लिए।

यह पूरी तरह से काम करता है, मैं 40 दस्तावेजों बैचों प्रत्येक कॉल (लगभग 3 मिनट के दौरान) है तो थोड़ी देर के लिए रोक सकते हैं और जब तक वह पूरा हो जाता है फिर से शुरू की प्रक्रिया। प्रत्येक कॉल चेकबॉक्स लिंक किए गए सर्वर हैंडलर द्वारा ट्रिगर किया जाता है, चेक बॉक्स स्वयं हैंडलर फ़ंक्शन में बदल जाता है, जिससे इस तरह अपना ट्रिगर बन जाता है।

मेरा प्रश्न (अंत में ;-) है: यह जानकर कि पूरी प्रक्रिया में 30 से 60 मिनट लग सकते हैं, यह कितना सटीक है? इन सर्वर हैंडलर फ़ंक्शन को एकाधिक प्रक्रिया के रूप में क्यों माना जाता है क्योंकि वे फ़ंक्शन के अंदर से बनाए जाते हैं?

मुझे आशा है कि मैं काफी स्पष्ट है, (जो मुझे शक है के बाद से यह थोड़ा मेरे मन में भ्रमित :-)

मैं घड़ी परीक्षण ऐप है कि मुझे विचार दिया कोड के नीचे में शामिल होने है हूँ, यह शायद चीजों को समझने में आसान बना देगा।

function doGet() { 
    var app = UiApp.createApplication().setTitle('Counter/Timer'); 
    var Panel = app.createAbsolutePanel().setStyleAttribute('padding','35'); 
    var counter = app.createHTML().setId('counter').setHTML('<B>Timer = wait</B>').setStyleAttribute('fontSize','40px');// set start display 
    var clo = app.createTextBox().setName('clo').setId('clo').setValue('0').setVisible(false);//set start value in seconds 
    var handler1 = app.createServerHandler('doSomething').addCallbackElement(Panel); 
    var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setId('chk1').setVisible(false); 
    app.add(Panel.add(chk1).add(counter).add(clo)); 
    chk1.setValue(true,true);// start the process 
    return app} 

function doSomething(e) { 
    var app = UiApp.getActiveApplication(); 
    var xx = Number(e.parameter.clo); 
    var disp = app.getElementById('counter') 
    xx++ ;// replace by xx-- to count downwards 
    if(xx>600){ // 10 minutes timeout for example 
    disp.setHTML('<B> GAME OVER ;-)</B>').setStyleAttribute('fontSize','80px').setStyleAttribute('color','RED') 
    return app 
    } 
    var cnt = app.getElementById('clo').setValue(xx) 
    disp.setHTML('<B>'+T(xx)+'</B>') 
    Utilities.sleep(1000); // instead of sleeping do something ! 
// below comes the "active" part 
    var chk1 = app.getElementById('chk1').setValue(false,false) 
    var chk1 = app.getElementById('chk1').setValue(true,true) 
    return app; 
} 

function T(val){ 
    var min = parseInt(val/60); 
    var sec = val-(60*min); 
    if(sec<10){sec='0'+sec} 
    if(min<10){min='0'+min} 
    var st = '> '+min+':'+sec 
    return st 
} 

enter image description here

+0

हालांकि यह प्रश्न बहिष्कृत यूआई सेवा का उपयोग करता है, तो आप HTML सेवा का उपयोग करके एक ही प्रभाव को पूरा कर सकते हैं। [ब्रूस मैकफेरसन ने इसके बारे में ब्लॉग किया है।] (Http://ramblings.mcpher.com/Home/excelquirks/htmlservice/parallel) – Mogsdad

उत्तर

10

बयान है कि सर्वर हैंडलर फ़ंक्शन कॉल स्वतंत्र प्रक्रियाओं क्योंकि वे "समारोह के भीतर की बनाई गई हैं" नहीं कर रहे हैं पूरी तरह सच नहीं है।

आपने सर्वर हैंडलर doSomething के साथ एक चेकबॉक्स तत्व chk1 सेट अप किया है। जब भी चेकबॉक्स चेक किया गया है, तो, एक ईवेंट सर्वर पर प्रेषित किया गया है। (... और आपकी स्क्रिप्ट उन घटनाओं को हर chk1.setValue() कॉल के साथ उत्पन्न कर रही है) checkBox और आसपास के यूआई कोड आपके ब्राउज़र में चल रहे हैं - "स्रोत दिखाएं" पर क्लिक करें या Google सर्वर द्वारा आपके ब्राउज़र पर क्या सेवा दी गई है यह देखने के लिए एक एक्सप्लोरर का उपयोग करें। (चेतावनी - यह obfuscated है।लेकिन आप अपने तार में से कुछ को पहचान सकता है, और है कि अपने क्लाइंट-साइड कोड से)

यहाँ है कि हम क्या Class ServerHandler के लिए दस्तावेज में बताया:।

जब एक ServerHandler शुरू हो जाती है, यह समारोह संदर्भित करता है कि ऐप्स स्क्रिप्ट सर्वर पर "ताजा" स्क्रिप्ट में कहा जाता है।

आपके ऑपरेटिंग समय को बढ़ाने का मुख्य है कि: एक पूरी तरह से नए ऑपरेटिंग संदर्भ में doSomething() के आह्वान में प्रत्येक भेजा घटना परिणाम - जैसे आप एक अलग ब्राउज़र में स्क्रिप्ट संपादक खोल दिया है यह है, और "रन" पर क्लिक किया आपकी लिपि "ताजा" स्क्रिप्ट के पिछले रन के विभिन्न मानों तक कोई पहुंच नहीं है ... लेकिन इसे टाइमर समेत ऑपरेटिंग प्रतिबंधों का अपना सेट भी दिया जाता है।

पीएस: आपको यह सुनिश्चित करना चाहिए कि सर्वर-साइड हैंडलर लॉक का उपयोग करके "थ्रेड सुरक्षित" है, क्योंकि आप साझा संसाधनों तक पहुंच रहे हैं जिन्हें doSomething() कॉलबैक के कई उदाहरणों तक पहुंचा जा सकता है। कि करने के लिए संबंधित है, यह इस स्क्रिप्ट के साथ एक और सीमा हिट करने के लिए संभव है:

Screenshot - error

बस मस्ती के लिए, मैं chk1 पर बाहर .setVisible(false) टिप्पणी की है, तो चैकबॉक्स दिखाई देता होगा। इसके बाद मैंने इसे कई दर्जन बार तेजी से क्लिक किया। टाइम डिस्प्ले आउट-ऑफ-ऑर्डर चला गया, और अंत में उपर्युक्त त्रुटि पॉप अप हो गई। (कुछ मिनट बाद) यह निश्चित रूप से एक कृत्रिम स्थिति है, लेकिन फिर भी एक त्रुटि स्थिति है जिसे आसानी से बचाया जाता है।

पीपीएस: मुझे आश्चर्य है कि कोई एक समान तकनीक का उपयोग एकाधिक समांतर सर्वर-साइड हैंडलर भेजने के लिए कर सकता है, और इस प्रकार पूरे काम को पूरा करने के लिए विलुप्त समय को कम कर सकता है?

+1

इस स्पष्ट उत्तर के लिए धन्यवाद, मुझे पता था कि आप इसे पसंद करेंगे ;-) बीटीडब्ल्यू, जो पुष्टि करता है कि यह एक है निष्पादन समय सीमा को हल करने का अच्छा तरीका ... मैं लॉक फीचर को भी लागू करूंगा, भले ही मैंने कभी भी किसी भी सहमति के मुद्दे का अनुभव नहीं किया हो। –

+0

वाह दिलचस्प दृष्टिकोण। मुझे इसका इस्तेमाल करना होगा। वर्तमान में मैं कार्य पंक्तियों और थ्रेडिंग की नकल करने के लिए प्रोग्रामेटिक रूप से ट्रिगर बनाने का उपयोग कर रहा हूं ....... –

+0

दिलचस्प दृष्टिकोण। हालांकि यह थ्रेडिंग उपयोग के मामले के लिए काम करने के लिए ऐसा लगता है, उपयोगकर्ता को माउसओवर ईवेंट होने पर भी कुछ कार्रवाई करना पड़ता है। मैं ब्राउज़र में UiApp लोडिंग के गुण से केवल सर्वरहैंडर को बंद नहीं कर सकता ....... –

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

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