1

ねじれたリアクターに基づくサーバーがあり、次のシナリオが必要です。サーバーは2種類のリクエストを受け取ることができます

  • ADD(x,y) を計算し、合計を返します
  • 人間のユーザーがクライアントの IP を承認した場合にのみ true を返す HUMAN_PERMISSION

私は tkMessageBox を使用して人間のユーザーに尋ねていますが、問題はリアクター全体をブロックし、サーバーが他の要求に応答しなくなることです

ここで何らかの方法でtwistedのdeferredを使用する必要があることを理解していますが、これがどのように機能するかわかりません:動作していないようです、それでもリアクター全体をブロックします

d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?", clientIp)
d.addCallback(confirmUser)
4

1 に答える 1

0

Deferred は、コードをノンブロッキングにするために何もできません。できることは、既存の非ブロッキング イベントに基づいてコールバック チェーンを管理することだけです。これにより、「一部のバイトが受信された」、「接続が失われた」、「ユーザーがボタンをクリックした」などの低レベルのイベントを、「HTTP 要求が応答された」や「ユーザーが応答した」などの高レベルのイベントに変換できます。あなたの質問"。 deferLater、たとえば、Deferredしばらく時間が経過したときに単純に起動します。

を使用するのにリアクターは必要ありませんDeferred。例えば:

>>> from twisted.internet.defer import Deferred
>>> d = Deferred()
>>> def transformResult(result):
...     return result + 5
... 
>>> d.addCallback(transformResult)
<Deferred at 0x100521200>
>>> def itsDone(result):
...     print("It's done: " + str(result))
... 
>>> d.addCallback(itsDone)
<Deferred at 0x100521200>
>>> d.callback(3)
It's done: 8
>>> 

callback()どこからでも電話できます。通常はリア​​クタ イベントから呼び出されます。あなたの場合、代わりにイベントcallbackから呼び出したいと思うでしょう。Tk

とは言ってもTk、メインのリアクター スレッドにイベントを取得する方法が必要です。これは、 のメインループを認識しているリアクターを使用してTk行います。コメンターは、これには既存の API があると既に述べていますtwisted.internet.tksupport。これは最近最も人気のある GUIではないことを考えると、Tkいくつかの問題が見つかる可能性があるため、何か見つけた場合は報告してください。

于 2011-04-21T23:17:24.710 に答える