2

応答として API 呼び出しを実行する UDP リスナーを作成しようとしていますが、受信した UDP データグラムに含まれるデータに基づいています。callMultipleInThreads は、単一のスレッドで両方の関数を実行しているようです。UDP データグラムを受信すると、functionOne が終了し、functionTwo が (API 呼び出しを実行するために) 新しいスレッドで開始されることを期待していましたが、そうではないようです。

import time
from twisted.internet import reactor, threads

def functionOne(x):
    print x

def functionTwo(x):
    time.sleep(10)
    print x

commands = [(functionOne, ["First Function"], {})]
commands.append((functionTwo, ["Second Function"], {}))
reactor.listenUDP(9999, threads.callMultipleInThread(commands))
reactor.run()

私はスレッドコードを書くのが初めてです。2 番目の関数が functionOne の終了をブロックしないようにするにはどうすればよいでしょうか? funtionTwo で API 呼び出しをフォークする方がよい方法でしょうか?

4

1 に答える 1

1

ドキュメントで説明されているように、threads.callMultipleInThreadは 1 つのスレッドで関数を実行するため、相互にブロックすることができます。私があなたの目標を理解していれば、functionOne と同じスレッドを共有するのではなく、functionTwo を独自の新しいスレッドに延期する必要があります。ブロッキング呼び出しを Twisted に統合する方法についての簡単なセクションがあり、これはブロッキング呼び出しで deferToThread を使用しています。

最後に気付いたのは、プロトコルの実装です。そこで、UDP をリッスンしながら新しいスレッドで functionTwo を実行する方法を示す簡単なスニペットを示します。

import time                                                                                                                                                                                                  
from twisted.internet import reactor, threads                                                                                                                                                                
from twisted.internet.protocol import DatagramProtocol                                                                                                                                                       


class DoNotBlockMeProtocol(DatagramProtocol):                                                                                                                                                                
    def datagramReceived(self, data, (host, port)):                                                                                                                                                          
        reactor.callLater(0, functionOne, "First Function")                                                                                                                                                  
        threads.deferToThread(functionTwo, "Second Function")                                                                                                                                                
        print "received %r from %s:%d" % (data, host, port)                                                                                                                                                          self.transport.write(data, (host, port))                                                                                                                                                             


def functionOne(x):                                                                                                                                                                                          
    print x                                                                                                                                                                                                  


def functionTwo(x):                                                                                                                                                                                          
    time.sleep(10)                                                                                                                                                                                           
    print x                                                                                                                                                                                                  

reactor.listenUDP(9999, DoNotBlockMeProtocol())                                                                                                                                                              
reactor.run()

動作を確認するには、Linux シェルでこれを実行します。

$ echo -n “foo” | nc -4u -w1 localhost 9999

このガイドで UDP の使用について詳しく学ぶこともできます: https://twistedmatrix.com/documents/current/core/howto/udp.html

于 2016-01-29T13:47:44.473 に答える