1

私は、ファイル転送の進行状況を監視し、実際のサイズをターゲットと比較してからハッシュを計算し、目的のハッシュと比較して、すべてが正常であると思われるときにいくつかの追加機能を起動する非常に単純なスクリプトを持っています。

ファイル転送に使用されるツール(wget)をdelugedに置き換えました。これは、統合するための優れたAPIを備えています。

ファイルの進行状況を比較してハッシュを比較する代わりに、delugedがファイルのダウンロードを終了したときを知る必要があるだけです。それを達成するために、私はこのスクリプトを自分のニーズに合わせて変更することができましたが、私は頭をねじれたフレームワークに巻き付けようとして立ち往生しています。

それを乗り越えるために、私はねじれた延期されたドキュメントから1つのサンプルスクリプトを取得し、その周りにクラスをラップして、私が言及したこのスクリプトで使用しているのと同じ概念を使用しようとしました。

さて、reactorオブジェクトは基本的に再起動できないブロッキングループであるため、どうしたらよいか正確にはわかりません。

これは私が使用しているサンプルコードです:

from twisted.internet import reactor, defer
import time

class DummyDataGetter:
    done = False
    result = 0
    def getDummyData(self, x):
        d = defer.Deferred()
        # simulate a delayed result by asking the reactor to fire the
        # Deferred in 2 seconds time with the result x * 3
        reactor.callLater(2, d.callback, x * 3)
        return d

    def assignResult(self, d):
        """
        Data handling function to be added as a callback: handles the
        data by printing the result
        """
        self.result = d
        self.done = True
        reactor.stop()

    def run(self):

        d = self.getDummyData(3)
        d.addCallback(self.assignResult)

        reactor.run()

getter = DummyDataGetter()
getter.run()
while not getter.done:
    time.sleep(0.5)
print getter.result
# then somewhere else I want to get dummy data again

getter = DummyDataGetter()
getter.run() #this throws an exception of type error.ReactorNotRestartable
while not getter.done:
    time.sleep(0.5)
print getter.result

私の質問は次のとおりです。

  1. コードをブロックしないように、reactorを別のスレッドで起動する必要がありますか?

  2. もしそうなら、別のスレッドにあるこのリアクターにコールバックを追加するにはどうすればよいですか?reactor.callLater(2, d.callback, x * 3)私のメインスレッドから、と同じようなことをするだけですか?

  3. そうでない場合、同じプロセスで2回以上リアクターを起動/停止できないというこの問題を克服するための手法は何ですか?

4

1 に答える 1

0

OK、これに対して私が見つけた最も簡単なアプローチは、usingと呼ばれる別のスクリプトをsubprocess.Popen用意し、トレントのステータスとその他の必要なものをstdout(JSONを使用してシリアル化)にダンプし、それを呼び出し元のスクリプトにパイプすることです。

ねじれた学習よりもトラウマははるかに少ないですが、もちろん最適からはほど遠いです。

于 2012-12-04T02:46:43.713 に答える