2016-05-06 5 views
2

私はかなり長い時間(60秒以上)かかるリモート呼び出しを行う必要があります。私たちのコード全体はcallRemoteからの戻り値の処理に依存しているので、twqisted + 50ワーカースレッドを実行しているにもかかわらず、IO全体をブロックしているのでかなり悪いです。Twisted callRemote

は、我々は現在

result = threads.blockingCallFromThread(reactor, callRemote, "method", args) 

のようなものを使用して/結果を得るに行くが、その名前は、それがイベントループを遮断することだと言うように、私たちは、同時に複数の結果を待つことはできません。

これは、コード全体を非同期にするためにリファクタリングすることはできません。だから、唯一の方法はスレッドに長いIOタスクを延期することだと思います。

私はスレッドでリモート呼び出しをしようとしていますが、ブロックコールからの結果を取得する方法が見つかりません。 remoteCallsが行われ、結果はどこかにあるが、私はちょうどそれにフックを取得することはできません。私は現在、何をしようとしている

は(なぜ?)繰延空を返し

reactor.callInThread(callRemote, name, *args, **kw) 

のように見えます。

私はある種のキューに結果を入れようとしていますが、うまく動作しません。それ、どうやったら出来るの ?

答えて

2

AFAIK、blockingCallFromThreadreactorのスレッドでコードを実行します。そういうわけで、あなたが必要としているように動かないのです。

私が正しく理解していれば、reactorスレッドから何らかの操作を外して、reactorスレッドに結果を取得する必要があります。

私は同じケースのためにdeferToThreadでアプローチを使用します。 Deferredの作り方と 例:

import time 
from twisted.internet import reactor, threads 

def doLongCalculation(): 
    time.sleep(1) 
    return 3 

def printResult(x): 
    print x 

# run method in thread and get result as defer.Deferred 
d = threads.deferToThread(doLongCalculation) 
d.addCallback(printResult) 
reactor.run() 

また、あなたがthreads.deferToThreadPoolに興味があるかもしれません。

Documentation about threading in Twisted.

+1

答えてくれてありがとうしかし、実際に私はすでにそれを試してみましたが、カップルの他のもの、と私は戻って繰延取得してきましたが、ない結果を(すなわち、それは、<0xの...で繰延>」出力します) blockingCallFromThreadを実行すると、私は取得します。何か案が ?私はそれがネストされた遅延と関係があると思いますが、内部の遅延を強制的に発生させる方法を見つけることはできません。 – DenverCoder9

+0

また、reactor.callInThreadもうまくいきませんでしたが、reactor.callInThreadとthreads.deferToThreadの違いは何ですか? – DenverCoder9

+0

ネストされた遅延については、可能であれば、あなたのコードを '@ defer.inlineCallback'でリファクタリングしようとしています。私は 'blockingCallFromThread'のソースを調べました。http://twistedmatrix.com/trac/browser/tags/releases/twisted-16.0.0/twisted/internet/threads.py#L93。このコードはコールバックとエラーバックからの結果を格納するために 'Queue.Queue'を使います。私の2番目のアドバイス: 'blockingCallFromThread'を模倣し、' Queue'でアプローチしますが、計算を別のスレッドに移すために 'callInThread'を使います。 –