我正在尝试编写一个UDP侦听器,它在响应中执行API调用,但是基于接收到的UDP数据报中包含的数据。似乎callMultipleInThreads在一个线程中运行两个函数。在收到UDP数据报后,我希望functionOne会在functionTwo以新线程启动时结束(进行API调用)这似乎并非如此。
{{1}}
我是编写线程代码的新手。怎么能更好地允许第二个功能不阻止functionOne关闭?是否会在函数中调用API函数?这是一种更好的方法吗?
答案 0 :(得分:0)
作为documentation explains, threads.callMultipleInThread 将在一个线程上运行您的函数,因此它们仍然可以相互阻塞。如果我理解了你的目标,你应该将functionTwo推迟到它自己的新线程,而不是与functionOne共享相同的线程。 how to integrate blocking calls with 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 shell上运行:
$ echo -n “foo” | nc -4u -w1 localhost 9999
您还可以在本指南中了解有关使用UDP的更多信息:https://twistedmatrix.com/documents/current/core/howto/udp.html