2011-03-23 10 views
6

कुछ कोड में मैं जीएई के लिए लिख रहा हूं, मुझे समय-समय पर किसी अन्य सिस्टम पर एक यूआरएल पर एक जीईटी करने की आवश्यकता है, संक्षेप में 'पिंगिंग' में और अगर अनुरोध विफल रहता है, समय समाप्त हो जाता है या सफल होता है तो मैं बहुत चिंतित नहीं हूं ।असिंक्रोनस URLfetch जब हमें परिणाम की परवाह नहीं है? [पायथन]

जैसा कि मैं मूल रूप से 'आग लगाना और भूलना' चाहता हूं और अनुरोध के इंतजार के द्वारा अपना कोड धीमा नहीं करना चाहता, मैं एक एसिंक्रोनस urlfetch का उपयोग कर रहा हूं, और get_result() को कॉल नहीं कर रहा हूं।

मैं करने के लिए एक स्पष्ट रूप से बेहतर तरीका लापता कर रहा हूँ (शायद समय समाप्ति या अन्य त्रुटियों के कारण) प्रतिक्रिया मिलान के बिना

मिला 1 RPC अनुरोध (ओं):

मेरी लॉग में मैं एक चेतावनी मिलती है इस? एक कार्य कतार या डिफर्ड कार्य इस उदाहरण में ओवरकिल की तरह (मेरे लिए) लगता है।

किसी भी इनपुट की सराहना की जाएगी।

+0

मैं मानते हुए कर रहा हूँ इस अजगर और नहीं जावा है? – jiggy

+0

आप सही हैं। मैंने सवाल अपडेट कर लिया है। अच्छी पकड़। –

+0

आपको यह निर्धारित करने के लिए उपकरण होना चाहिए कि URLFetch ऑपरेशन पूरा हो रहा है, और यदि ऐसा होता है, तो क्या आपके अनुरोध के पहले या बाद में कॉलर पर लौटाया जाता है। मुझे लगता है कि आप पाएंगे कि यह * खत्म हो गया है, और मूल अनुरोध के परिणाम के बाद 'प्रतीक्षा' स्पष्ट रूप से * होता है। हालांकि, मुझे इसके लिए कहीं भी स्पष्ट दस्तावेज नहीं मिला है, इसलिए व्यवहार बदल सकता है। – technomage

उत्तर

6

एक कार्य कतार कार्य यहां आपका सबसे अच्छा विकल्प है। लॉग में जो संदेश आप देख रहे हैं वह इंगित करता है कि अनुरोध आपके URLFetch को लौटने से पहले पूरा करने का इंतजार कर रहा है, इसलिए इससे मदद नहीं मिलती है। आप कहते हैं कि एक कार्य 'ओवरकिल' है, लेकिन वास्तव में, वे बहुत हल्के हैं, और निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है। डिफर्ड आपको कॉल करने के लिए फ़ंक्शन लिखने के बजाय सीधे फ़ेच कॉल को स्थगित करने की अनुमति देगा।

2

async_url_fetch को पूरा करने में कितना समय लगता है और आपकी प्रतिक्रिया प्रदान करने में कितना समय लगता है?

एपीआई पाइथन में काम करने के तरीके का लाभ उठाने का एक संभावित तरीका है।

कुछ बिंदुओं पर विचार करने के लिए।

  • कई वेबसर्वर और रिवर्स प्रॉक्सी शुरू होने के बाद अनुरोध रद्द नहीं करेंगे। तो यदि आपका रिमोट सर्वर आप पिंगिंग कर रहा है तो अनुरोध पर अनुरोध करने में काफी समय लगता है, तो अपनी create_rpc (समय सीमा = एक्स) पर एक समय सीमा का उपयोग करें, जैसे एक्स टाइमआउट के कारण वापस आ जाएगा। पिंग अभी भी सफल हो सकता है। यह तकनीक एपेंगिन के साथ ही काम करती है।

  • GAE RPC शुरू

    • make_call/make_fetch_call के माध्यम से cued किए जाने के बाद RPC शुरू वास्तव में कर रहे केवल एक बार भेजा उनमें से एक पर इंतजार कर रहे थे है।
    • इसके अलावा किसी भी पूर्ण आरपीसी के पास कॉलबैक होगा जिसे वर्तमान में एक खत्म होने पर प्रतीक्षा की जाती है।
    • आप async_urlfetch आरपीसी बना सकते हैं और make_fetch_call का उपयोग करके इसे अपने अनुरोध को संभालने में जितनी जल्दी हो सके इसे लागू कर सकते हैं, अभी तक प्रतीक्षा न करें।
    • काम करने के लिए मेमकैच/डेटास्टोर कॉल जैसे वास्तविक पृष्ठ पर काम करने वाले काम करें। इनमें से एक को पहला कॉल एक ऐसा इंतजार करेगा जो आपके async_urlfetch को प्रेषित करेगा।
    • यदि urlfetch इस अन्य गतिविधि के दौरान पूरा करता है तो urlfetch पर कॉलबैक कहा जाएगा, जिससे आप परिणाम को संभालने की अनुमति दे सकते हैं।
    • यदि आप get_result() कॉल करते हैं तो यह समय सीमा तक प्रतीक्षा() पर अवरुद्ध होगा या जब तक परिणाम तैयार न हो जाए तब तक यह लौटाएगा।

सारांश यह है।

उचित समय सीमा और कॉलबैक के साथ लंबे समय तक चलने वाले url_fetch तैयार करें। Make_fetch_call का उपयोग करके इसे एन्क्यू करें। वह काम करें जो आप पृष्ठ के लिए करना चाहते थे। Url_fetch को पूरा या समय सीमा के बिना गीलेर के बिना पृष्ठ को वापस लौटाएं और इसके बिना प्रतीक्षा किए।

जीएई में अंतर्निहित आरपीसी परत सभी असीमित है, ऐसा लगता है कि आप कामों में क्या इंतजार करना चाहते हैं, यह चुनने का एक और परिष्कृत तरीका प्रतीत होता है।

ये उदाहरण एक ही ऐप के दूसरे उदाहरण में नींद और url_fetch का उपयोग करते हैं। प्रतीक्षा के

उदाहरण() भेजने RPC काम:

class AsyncHandler(RequestHandler): 

    def get(self, sleepy=0.0): 
     _log.info("create rpc") 
     rpc = create_rpc() 
     _log.info("make fetch call") 
     # url will generate a 404 
     make_fetch_call(rpc, url="http://<my_app>.appspot.com/hereiam") 
     _log.info("sleep for %r", sleepy) 
     sleep(sleepy) 
     _log.info("wait") 
     rpc.wait() 
     _log.info("get_result") 
     rpc.get_result() 
     _log.info("return") 
     return "<BODY><H1>Holla %r</H1></BODY>" % sleepy 

प्रतीक्षा 4 सेकंड के लिए सो के बाद कहा जाता है की

2011-03-23 17:08:35.673 /delay/4.0 200 4093ms 23cpu_ms 0kb Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16,gzip(gfe) 
I 2011-03-23 17:08:31.583 create rpc 
I 2011-03-23 17:08:31.583 make fetch call 
I 2011-03-23 17:08:31.585 sleep for 4.0 
I 2011-03-23 17:08:35.585 wait 
I 2011-03-23 17:08:35.663 get_result 
I 2011-03-23 17:08:35.663 return 
I 2011-03-23 17:08:35.669 Saved; key: __appstats__:011500, part: 48 bytes, full: 4351 bytes, overhead: 0.000 + 0.006; link: http://<myapp>.appspot.com/_ah/stats/details?tim 
2011-03-23 17:08:35.636 /hereiam 404 9ms 0cpu_ms 0kb AppEngine-Google; (+http://code.google.com/appengine; appid: s~<myapp>),gzip(gfe) 

Async कॉल भेजा प्रेषण को दर्शाता है।

E 2011-03-23 17:08:35.632 404: Not Found Traceback (most recent call last): File "distlib/tipfy/__init__.py", line 430, in wsgi_app rv = self.dispatch(request) File "di 
I 2011-03-23 17:08:35.634 Saved; key: __appstats__:015600, part: 27 bytes, full: 836 bytes, overhead: 0.000 + 0.002; link: http://<myapp>.appspot.com/_ah/stats/details?time 

काम को दूर करने के लिए एक memcache RPC के इंतजार का उपयोग करके दिखा रहा है।

class AsyncHandler(RequestHandler): 

    def get(self, sleepy=0.0): 
     _log.info("create rpc") 
     rpc = create_rpc() 
     _log.info("make fetch call") 
     make_fetch_call(rpc, url="http://<myapp>.appspot.com/hereiam") 
     _log.info("sleep for %r", sleepy) 
     sleep(sleepy) 
     _log.info("memcache's wait") 
     memcache.get('foo') 
     _log.info("sleep again") 
     sleep(sleepy) 
     _log.info("return") 
     return "<BODY><H1>Holla %r</H1></BODY>" % sleepy 

AppEngine प्रॉड प्रवेश करें:

2011-03-23 17:27:47.389 /delay/2.0 200 4018ms 23cpu_ms 0kb Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16,gzip(gfe) 
I 2011-03-23 17:27:43.374 create rpc 
I 2011-03-23 17:27:43.375 make fetch call 
I 2011-03-23 17:27:43.377 sleep for 2.0 
I 2011-03-23 17:27:45.378 memcache's wait 
I 2011-03-23 17:27:45.382 sleep again 
I 2011-03-23 17:27:47.382 return 
W 2011-03-23 17:27:47.383 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors) 
I 2011-03-23 17:27:47.386 Saved; key: __appstats__:063300, part: 66 bytes, full: 6869 bytes, overhead: 0.000 + 0.003; link: http://<myapp>.appspot.com/_ah/stats/details?tim 
2011-03-23 17:27:45.452 /hereiam 404 10ms 0cpu_ms 0kb AppEngine-Google; (+http://code.google.com/appengine; appid: s~<myapp>),gzip(gfe) 

Async यूआरएल भेजा लाने जब memcache.get कॉल प्रतीक्षा()

E 2011-03-23 17:27:45.446 404: Not Found Traceback (most recent call last): File "distlib/tipfy/__init__.py", line 430, in wsgi_app rv = self.dispatch(request) File "di 
I 2011-03-23 17:27:45.449 Saved; key: __appstats__:065400, part: 27 bytes, full: 835 bytes, overhead: 0.000 + 0.002; link: http://<myapp>.appspot.com/_ah/stats/details?time 
+0

यह एक आसान समाधान नहीं है, लेकिन इसका उद्देश्य विचार के लिए कुछ भोजन प्रदान करना है। – kevpie

+0

टाइमआउट के बारे में अच्छी बात। मैं निश्चित रूप से निश्चित हूं कि आप आरपीसी के बारे में गलत हैं, केवल एक बार प्रतीक्षा किए जाने के बाद प्रेषित किया जा रहा है, हालांकि - केवल dev_appserver में मेरे सर्वोत्तम ज्ञान के लिए लागू होता है। –

+0

@ निक, मुझे दोबारा जांच करनी पड़ी। स्रोत में प्रलेखन वर्तमान में भविष्य की भविष्यवाणी कर रहा है या थोड़ा भ्रामक हो सकता है। ऐसा कुछ ऐसा नहीं है जब तक कि वे एसिंक एपीआई कॉल करने की खरपतवार में गंभीरता से नीचे न हों। एसिंक पेज बनाने के बाद एसिंकक्ट्स बनाने के बाद मुझे एक सपना था जो समानांतर में सबकुछ करता था। एक साल पहले मैं एक ऐसे उपकरण पर काम कर रहा था जिसने वास्तविक समय में कई ओथ कुंजी/सार्वजनिक फॉलबैक के साथ फेसबुक/ट्विटर/लिंक्डइन के बीच दर्जनों हस्ताक्षरित एपीआई कॉल किए। जीएई आरपीसी परत प्रदान करता है समानांतरता बस आश्चर्यजनक है। – kevpie

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