5

以下の 2 つのコード スニペットで何が起こるかを理解したいと思います -

スニペット#1

from twisted.internet import threads, defer, reactor

def proc1(a):
    while True:
        print "Proc----------1"

def proc2(a):
    while True:
        print "Proc----------2"

def proc3(a):
    while True:
        print "Proc----------3"

d1 = threads.deferToThread(proc1)
d2 = threads.deferToThread(proc2)
d3 = threads.deferToThread(proc3)

reactor.run()

私の理解では、すべてのスレッドが並列に実行され、出力は => すべての proc が混在した stdout です。

スニッパー#2

from twisted.internet import threads, defer, reactor

def proc1(a):
    while True:
        print "Proc----------1"

def proc2(a):
    while True:
        print "Proc----------2"

def proc3(a):
    while True:
        print "Proc----------3"



d1 = defer.Deferred()
d2 = defer.Deferred()
d3 = defer.Deferred()

d1.addCallback(proc1)
d2.addCallback(proc2)
d3.addCallback(proc3)

d1.callback('a')
d2.callback('a')
d3.callback('a')

reactor.run()

そして、このスニペットでは、各遅延コールバックが次々にトリガーされ、出力に関する限り、proc1 stdouts だけが無期限に注ぎ込まれます。

私が間違っている場合は修正してください。したがって、基本的に私が理解し確認したいのは、遅延オブジェクトが次々にトリガーされるのに対し、deferToThread は名前スレッドのように並列に実行されることです。

4

2 に答える 2

5

私が間違っている場合は修正してください。したがって、基本的に私が理解し確認したいのは、遅延オブジェクトが次々にトリガーされるのに対し、deferToThread はスレッドという名前で並列に実行されることです。

これは正確ではありませんが、ある程度近いものです。Deferred をトリガーするコードは次のとおりです。

d1.callback('a')
d2.callback('a')
d3.callback('a')

あなたはそれらを次々と引き起こしました。これについて特に特別なことや神秘的なことは何もありません。それがPythonの仕組みです。

Deferred はスレッドとは何の関係もありません。コードを自動的にノンブロッキング、非同期、またはマルチスレッドにするわけではありません。関数のリストを保持し (メソッドを使用してそのリストに追加したaddCallback)、そのリスト内の関数を呼び出します (callbackメソッドを使用する場合)。

于 2014-02-19T16:53:54.153 に答える
1

あなたの理解はOKです。

スニペット 1 は、すべてのプロシージャを同時に実行します (それぞれのスレッドで)。3 つのプロシージャーは、スレッドセーフでなければなりません。

スニペット 2 は、reactor スレッドでプロシージャを次々に実行します。1 つのプロシージャが完了したときにのみ、リアクター スレッドは次の延期されたプロシージャに渡され、次のプロシージャの実行が開始されます。

deferred の 1 つが twisted の一部である場合、たとえば、ネットワーク経由で何かにアクセスするために、reactor がブロックされると、reactor は次のブロックされていない deferred に移動し、ブロックが解除された後、ブロックされたものを最終的にピックアップします。

プロセスの 1 つが別のプロセスに干渉することを心配する必要はありません (ただし、プロセスを呼び出す他のコードや複数のリアクターがそれらを呼び出すことがない場合)。

于 2014-08-21T15:45:06.847 に答える