2011-10-24 10 views
4

Twistedアプリケーション(.tacファイル)を書く際にいくつかのことを理解していないような気がします。 .pyスクリプトで遅延オブジェクトを使用するのは最後にreactor.run()を呼び出すだけで簡単ですが、ねじれたアプリケーションサンプルコードでreactor.run()が使用されていません。Twistedアプリケーション内の遅延オブジェクトの使用

誰かが説明することができます:

  1. reactor.run()がねじれたアプリケーション(または、これは誤った結論である場合)に呼び出されない理由を私はreactor.run()
  2. を呼び出すことなく、おそらくツイストアプリケーション内繰延オブジェクトを使用することができますどのよう
  3. と、ツイストスクリプト対アプリケーションの一般的な違い。

答えて

12

1. reactor.run()が、.tacファイルの中で呼び出されないのはなぜですか?

.tacファイルは、 "twistd"コマンドラインツールによって読み込まれます。このツールは、リアクタを実行します。

原子炉を稼働させることは、プログラムの主なポイントとなるコードのビットによって、何度も実行されることです。ほとんどのツイストコードは事実上、ある種のプラグインであり、より大きなシステムのコンテキストで動作することを意図しています。 .tacファイルの特定の場合には

は、彼らは、スタンドアロンPythonプログラムとして実行されることを意図されることはありません。彼らの仕事は、原子炉起動します(Serviceオブジェクトの添付束と)Applicationオブジェクトを生成することです走るtacファイル自体はあまり効果がないことが重要です。たとえば、問題の実装であるServiceが、特権と非特権を実行する必要のあるコードを分離する必要があります。これは厳しいプロセスです。 .tac自体で作業が行われると、間違ったユーザーとしてうっかり実行される可能性があります。

2. DeferredはTwistedアプリケーションの中で、reactor.run()を呼び出すことなくどのように使用できますか?

Deferredは、単純にコールバックチェーンを管理するメカニズムです。 reactor.run()に電話する必要はありません。実際には、リアクターを使用することもできます。たとえば、次のように述べ

>>> from twisted.internet.defer import Deferred 
>>> d = Deferred() 
>>> def hello(result): 
...  print "'d' was fired:", result 
...  return result + 3 
... 
>>> d.addCallback(hello) 
<Deferred at ...> 
>>> print d 
<Deferred at ...> 
>>> d.callback(7) 
'd' was fired: 7 
>>> print d 
<Deferred at ... current result: 10> 

Deferredを返す多くのAPIは最終的に.callback()を呼び出すためにいくつかの作業を行うための反応装置を必要としています。たとえば、あなたがそうした場合...

>>> from twisted.internet.task import deferLater 
>>> from twisted.internet import reactor 
>>> deferLater(reactor, 1.0, lambda: 20).addCallback(hello) 
<Deferred at ...> 
>>> 

...誰かが原子炉を動かさない限り、あなたは永遠にそれを待っているでしょう。それが起こるまで、何も印刷されません。あなたはpython -m twisted.conch.stdioはなくpythonでこのインタラクティブな例を実行していた場合など、あなたがその対話プロンプトがすでに原子炉が稼働しているのでDeferredが、秒後にコールバックを受けることがわかります - 原子炉がすでに実行されている場合

しかし、 。

3.ツイストスクリプトとアプリケーションの違いは何ですか?

これは実際に形式的に区切られた用語ではありません。どんなPythonスクリプトでも、Twistedからコードをインポートして、それを望みどおりに使うことができるので、コンピュータプログラム以外の特定のプロパティが "スクリプト"に適用されるとは言い難いです。ツイストアプリケーションによって、あなたが.tacファイルやプラグインを意味する場合

は、違いはこの種のコードは、サービス(ご tacファイルやプラグインでトップレベルのコード)を構築する部分に分離されていることです実際に作業を行う部分( privilegedStartService/ startService/ stopServiceというトップレベルコードが設定されているサービスの実装)。また、このコンテキストで実行されるコード( twistdによって駆動される)は、 twistdによって設定されて実行されるため、原子炉自体を実行する必要はありません。 twistd異なる原子炉( selectpollepollkqueue、など)と twistd前に原子炉を自分でインポートすると解除されますそれを設定する機会を持っているを使用する能力を提供するため、このようなコードは、それゆえ、 twisted.internet.reactorをインポートしないように注意しなければなりませんこの機能。

+0

'tac'ファイルの仕組みを明確にしてくれてありがとう。この質問に私を導いたAPIは、 'twisted.enterprise.adbapi' APIで、これはSQLクエリのための遅延を返します。私は、 'reactor.run()'が呼び出されたときにだけ終了することに気づきました。 'twistd'で作成された原子炉ループにクエリを追加するにはどうしたらいいですか? – richard

+0

単一のstackoverflow質問に関する3つの質問で十分かもしれません。 :) –

関連する問題