2011-02-25 43 views
0

本質的に、私はリモートXMLRPCサーバーへの呼び出しを行い、要求を非同期に処理します。Pythonでの同期呼び出しへの非同期呼び出し

import xmlrpclib 

client = xmlrpclib.ServerProxy('http://localhost:8080') 

client.add(3,5) 


def add_result(result): 
    print result 

将来的にはadd_resultが結果を呼び出すことがわかります。事はです。私は結果を返すブロッキングコールにclient.addを呼び出すことができるようにしたい。私は私に電話するGUIのためにこれをやっています。問題は、この種の解決策について、どこで調べるべきですか?私はどこから始めたらいいのか分からない。

私は自分自身については全く説明していないと思う。 私が呼び出すサーバーは、非同期部分を実装しています。 addを呼び出すと、trueを返します。そして私は、サーバーが私に呼び出すものであるadd_resultを実装することを期待していることを知っています。私がしようとしているのは、誰かが私に電話をかけて、add_resultが呼び出されるまでブロックするように、このクレイジーなスキームをきれいにすることです。私はこれが物事をクリアすることを願っています

+4

えっ? xmlrpclibの動作ではなく、 'client.add(3,5)'という呼び出しは、他の関数と同様にブロックして返します。ツイストのxmlrpclibを意味しますか? –

+1

'add_result'を遅延コールバックのように動作させ、非同期的に呼び出される' client.add'のようにするには、どんなmagickeryが存在すると思いますか? – Santa

+0

申し訳ありませんが、私はひどく自分自身を説明しました、編集がそれをクリアすることを願って – MattyW

答えて

0

あなたの主張はナンセンスです。 xmlrpclib操作は同期しており、ブロックしています。非同期操作などを実行するには、スレッドを使用して何かを実装する必要があります。私はpynatorに同意

0

...

しかし、あなたはブロック片に助けが必要な場合には...ブロックするための設計が非常に簡単です

class GUI(): 
    def __init__(self): 
     self.blocking_thread = Thread(target=self.get_data) 
     self.client = xmlrpclib.ServerProxy(...) 

    def query_for_data(): 
     self.blocking_thread.start() 
     self.blocking_thread.join() 

    def get_data(self): 
     while(True): 
      #this assumes this returns some how and doesn't block.. 
      result = self.client.add(...) 
      if(result): break; 

      time.sleep(1) 
関連する問題