2011-03-23 11 views
6

GAE için yazdığım bir kodda, başka bir sistemde bir URL'de düzenli olarak bir GET gerçekleştirmem gerekiyor, özünde 'ping' oluyor ve istek başarısız olursa, zaman aşımına uğradığında veya başarılı olursa endişelenmiyorum .Sonuç umurumda değilken eşzamanlı olmayan URLfetch? [Python]

Temelde 'yangın ve unutama' isteğimi yerine getirmek ve isteğimi bekleyerek kendi kodumu yavaşlatmak istemediğimden, eşzamansız bir urlfetch kullanıyorum ve get_result() öğesini çağırmıyorum.

Yapacak bir besbelli iyi bir yol eksik (muhtemelen zaman aşımları veya diğer hatalar için) yanıtı ile eşleşmeyen

Bulunan 1 RPC isteği (ler): Benim günlüğünde

Ben bir uyarı olsun bu? Bir Görev Kuyruğu veya Ertelenmiş Görev (bana) bu örnekte aşırı sıkma gibi görünüyor.

Herhangi bir girdi hoşunuza giderdi.

+0

'Küstah? – jiggy

+0

Haklısınız. Soruyu güncelledim. İyi yakalama. –

+0

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

cevap

6

Burada bir görev sırası görevi en iyi seçeneğidir. Günlüğünde gördüğünüz mesaj, URLFetch'inizin geri dönmeden önce isteğinin beklemesini beklediğini belirtir. Bu, bu yardımcı olmaz. Bir görevin 'overkill' olduğunu söylüyorsunuz, ama gerçekten çok hafif ve kesinlikle bunu yapmanın en iyi yolu. Ertelenmiş arama yapmak için bir işlev yazmak zorunda kalmadan, alma çağrısını doğrudan ertelemenize bile izin verir.

2

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 
+0

Bu basit bir çözüm değildir, ancak düşünce için bazı yiyecekler sağlamayı amaçlamaktadır. – kevpie

+0

Zaman aşımları hakkında iyi bir nokta. RPC'lerin yalnızca beklemeden sonra gönderilmesinin yanlış olduğunu kesinlikle biliyorum. Ancak bu sadece dev_appserver'da bilgimin en iyisi için geçerlidir. –

+0

@Nick, Çifte kontrol etmek zorunda kaldım. Kaynaktaki belgeler şu anda geleceği tahmin ediyor olabilir veya biraz yanıltıcı olabilir. Bu, async api çağrılarını yapmanın yabani otlarında ciddi bir şekilde aşağı olmadıkça neredeyse hiç kimsenin karşı karşıya gelemeyeceği bir şeydir. Herşeyi paralel yapan bir uyumsuz sayfa fragmanı çözümleyicisi oluşturmak için asynctools oluşturduktan sonra bir rüya gördüm. Bir yıl önce, facebook/twitter/linkedin arasında gerçek zamanlı olarak çoklu oauth anahtar/genel geri dönüşler arasında düzinelerce imzalanmış api araması yapan bir araç üzerinde çalışıyordum. GAE RPC katmanının sağladığı paralellik sadece şaşırtıcıdır. – kevpie

İlgili konular