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
が
異なる原子炉(
select
、
poll
、
epoll
、
kqueue
、など)と
twistd
前に原子炉を自分でインポートすると解除されますそれを設定する機会を持っているを使用する能力を提供するため、このようなコードは、それゆえ、
twisted.internet.reactor
をインポートしないように注意しなければなりませんこの機能。
'tac'ファイルの仕組みを明確にしてくれてありがとう。この質問に私を導いたAPIは、 'twisted.enterprise.adbapi' APIで、これはSQLクエリのための遅延を返します。私は、 'reactor.run()'が呼び出されたときにだけ終了することに気づきました。 'twistd'で作成された原子炉ループにクエリを追加するにはどうしたらいいですか? – richard
単一のstackoverflow質問に関する3つの質問で十分かもしれません。 :) –