Thrift Asenkron Fonksiyonlarda callbacks?

4 Cevap php

Thrift o use the oneway modifiye etmek mümkündür içinde to specify a call as asynchronous.

Görünüşe göre, bu fonksiyonun yürütme tamamlandığında idam edilecek olsa da, bir callback tanımlamak mümkün değildir.

Bu ağır hesaplama sunucu tarafında tamamlandığında, ben ona bir bildirim göndermek, böylece ben tek olasılık, benim Thrift istemci (PHP) bazı "sunucu" yetenekleri vermek gibi görünüyor . Bu benim yeni tanımları, yeni hizmetler ve tüm geri kalanı ile, yeni bir. Tasarruf dosyası var ve ben Thrift ile php-sunucu tarafı kodu oluşturmak gerektiği anlamına gelir.

Bu mümkün olsa bile, bu benim için bir overkill gibi görünüyor ve geri arama uygulamak için daha akıllı bir yol olup olmadığını merak ediyorum.

Çocuklar, sizden bazı geribildirim için bekliyorum.

4 Cevap

Roberto, ne yazık ki Thrift çerçevesi böyle yerleşik bir işleve sahiptir. Orada may be a number of alternatives, olsa da, [) (1] PHP istemci oturumu normalde (Eğer {kullanılmış olmasaydı cevap hesaplama-yoğun Thrift sunucu için bekledi olurdu süre içinde ne yapmak istediğinize bağlı olarak }.)

Ben sadece, bir kullanıcı (ya da paralel birkaç kullanıcı) Her bir hesaplama-yoğun görev tetikleyebilir bir web uygulamasını kodlu olması, size bazı geribildirim vermek istiyorum bir durumda olduğunu, şimdi, hayal kullanıcıların dedi iken görevleri boyunca yayık dedi.

Başlangıçtan itibaren, size önlemek için çalışıyoruz çözüm önlemek için çalışırken kesinlikle haklısın. Sizin PHP istemci oturumları cannot service a callback interface without blocking (sen pcntl_fork veya diğer bazı PHP threading band-aid kullanmaya çalışıyor hatta daha derin bir delik kazmak sürece.)

Bunun dışında basit ve IMHO en iyi yolu, uygulama birkaç yolu vardır, iki switch from an event-driven model (I want to be notified when the server is done) to a polling model (I will periodically inquire with the server whether or not it is done.) Olduğunu sunucu hem de örneğin, istemci tarafı, birden fazla uygulama seçenekleri olan bir yoklama modeli:

  1. esnasında invocation phase,

    • PHP istemci oturumu eşsiz job_id değeri ayırır; oturumu sonra uyumsuz hesaplama-yoğun Thrift sunucuya oneway çağrı void compute(..., job_id), yapar

    -- or --

    • PHP istemci oturumu hesaplama-yoğun Thrift sunucuya bir synchronous çağrısı job_id start_compute(...) yapar; Sunucu benzersiz job_id değeri, daha sonra hemen tahsis job_id ile PHP istemci oturumu dönen, ayrı bir iş parçacığı / işlemde gerçek hesaplama-yoğun görev çoğaltılır ayırır
  2. esnasında computation phase,

    • periyodik bir synchronous status get_status(job_id) hesaplama-yoğun Thrift sunucuya çağrı üzerinden hesaplama-yoğun iş durumunu kontrol etmek PHP istemci oturumu gelirleri,

    -- or --

    • PHP istemci oturumu periyodik hesaplama-yoğun iş durumunu kontrol etmek için tarayıcı job_id geçen ve aynı zamanda tarayıcı talimat sonrasında, değerli kaynakları boşaltmak için hemen sonlandırır {[(0) }] (örn. META REFRESH , or via an XHR (AJAX) request from Javascript, etc.); the browser check spawns a brief PHP client session which performs the synchronous status get_status(job_id) üzerine bu olabilir hangisi durumunu () iletme hemen sonra sonlandırma, hesaplama-yoğun Thrift sunucuya çağrı tarayıcı

Ben Yığın taşması farklı bir kanalda bir cevap aldık. Yazar beni burada onun cevabını yayınlamak için izin verdi beri, ben bu toplumda başkasına yararlı olabileceğini düşündüm.

Hey Robert,

Yeah, this has come up on the Apache lists before. There is no elegant way to do what you're asking for with Thrift. It's fundamentally not designed for bidirectional messaging.

There are hacks around this, such as: - client-side polling - invoking send_method(), waiting on the client side, then recv_method(), instead of just method() - making the client also implement a Thrift server

But obviously none of these are true bi-directional messaging. We've tried to keep the Thrift interfaces as simple as possible and focused on the core RPC use case, which has meant leaving some stuff like this out.

Probably not the answer you were hoping for.

Alkış, mcslee

(- http://stomp.github.com STOMP) uyumsuz olaylar müşteri bilgilendirmek yerine Thrift (protokol significanty ağır sanırım yapmış olur bir şey) ile geri çağrıları uygulamak için çalışıyor, ben hafif bir mesajlaşma servisini kullanabilirsiniz.

Benim yaklaşım Thrift istemci, belirli bir STOMP kanala abone, ve uyumsuz bir olay olduğunda Thrift sunucu, aynı kanalda yayınlayacağız olmasıdır. İstemci daha sonra olayla ilgili ek bilgi için sunucu sorgulayabilirsiniz.

Peki Java Asynchronus Mesaj Gelecek Nesne referansı ile çağrı var. Bu Message Pack kullanarak bir RPC modelde uygulanabilir. PHP benzer bir şey varsa ben emin değilim.