Async_url_fetch'in tamamlanması ne kadar sürer ve yanıtınızı almak ne kadar sürer?
İşte api'nin python'da çalışma şeklinden yararlanmak için olası bir yaklaşım.
Dikkate alınması gereken bazı noktalar.
Birçok web sunucu ve ters proxy, başlatıldıktan sonra bir isteği iptal etmeyecektir. Yani, uzak sunucunuz ping işlemi yapıyorsa, ancak istekte bulunacak kadar uzun bir süre alıyorsa, zaman aşımı nedeniyle X'in geri döneceği şekilde, create_rpc'inizde (son tarih = X) bir son tarih kullanın. Ping hala başarılı olabilir. Bu teknik, appengine'e karşı da çalışır. make_call/make_fetch_call aracılığıyla cued sonra
GAE'nin RPC
- RPC sadece bir tanesi bekledi sonra sevk aslında.
- Ayrıca, henüz bitmiş olan bir rpc de, beklemede bir beklemede beklerken geri çağrısı olacaktır.
- Bir async_urlfetch rpc oluşturabilir ve make_fetch_call kullanarak isteğinizi ele alırken mümkün olduğunca erken bir tarihte yazabilirsiniz, henüz beklemeyin.
- Çalışmanın gerçekleşmesi için memcache/datastore çağrıları gibi asıl sayfa sunum işlerini yapın. Bunlardan birine yapılan ilk çağrı, async_urlfetch'inizi gönderecek bir bekleme gerçekleştirecektir.
- Bu diğer etkinlik sırasında urlfetch işlemi tamamlanırsa, urlfetch üzerindeki geri arama çağrılır ve sonuçla başa çıkmanıza olanak tanır.
- get_result() öğesini çağırırsanız, son tarih olana kadar wait() öğesini engeller veya sonuç hazır olmadıkça döner.
Özetlemek gerekirse.
Uzun süre çalışan url_fetch'i makul bir son tarih ve geri arama ile hazırlayın. Make_fetch_call kullanarak onu sıkın. Sayfa için istediğin işi yap. Url_fetch'in tamamlanmış veya bitmiş olup olmadığına bakılmaksızın ve beklemeden sayfaya geri dönün.
GAE'deki temel RPC katmanı tüm zaman uyumsuzdur, işlerde beklemek istediğiniz şeyi seçmek için daha karmaşık bir yol var gibi görünüyor.
Bu örnekler, aynı uygulamanın ikinci bir örneğine uyku ve bir url_fetch kullanır. bekleme
Örnek() sevk rpc çalışması: 4 saniye boyunca uyuduktan sonra denilen
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
bekleyin zaman uyumsuz çağrı sevk
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)
sevkini göstermektedir.
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
Bir memcache kullanılarak gösterilen RPC'nin işi başlatmak için beklemesi.
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'de Prod Günlüğü: memcache.get çağırdığında
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 url sevk getirme bekleme() Bunu Python ve Java
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
'Küstah? – jiggy
Haklısınız. Soruyu güncelledim. İyi yakalama. –
URLFetch işleminin tamamlanıp tamamlanmadığını belirlemek için bir alette bulunmalı ve eğer varsa, isteğiniz aramadan önce veya sonra olsun, arayan kişiye geri dönün. Aslına bakarsanız, * işinin * biteceğini ve “bekle” nin dolaylı olarak gerçekleştiğini * göreceksiniz. Ancak, bunun için herhangi bir yerde açık bir belge bulamadım, bu nedenle davranış değişebilir. – technomage