Python 如何处理扭曲线程之外的数据
我正在尝试编写一个UDP侦听器,它执行API调用作为响应,但基于接收到的UDP数据报中包含的数据。callMultipleInThreads似乎在一个线程中运行这两个函数。在收到UDP数据报时,我希望functionOne会结束,因为functionTwo会在一个新线程中启动(执行API调用),但事实并非如此Python 如何处理扭曲线程之外的数据,python,twisted,twisted.internet,Python,Twisted,Twisted.internet,我正在尝试编写一个UDP侦听器,它执行API调用作为响应,但基于接收到的UDP数据报中包含的数据。callMultipleInThreads似乎在一个线程中运行这两个函数。在收到UDP数据报时,我希望functionOne会结束,因为functionTwo会在一个新线程中启动(执行API调用),但事实并非如此 import time from twisted.internet import reactor, threads def functionOne(x): print x de
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()
我不熟悉编写线程代码。如何更好地允许第二个函数不阻止functionOne关闭?在FunctionTwo中分叉API调用是更好的方法吗?作为线程。callMultipleInThread将在一个线程上运行函数,因此它们仍然可以相互阻塞。如果我理解了您的目标,那么您应该将functionTwo推迟到它自己的新线程,而不是与functionOne共享同一个线程。上有一个快速部分,这是在阻塞调用上使用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的更多信息:这不准确。通过“同一线程”,callMultipleInThread的文档意味着它将在同一个非反应线程上运行所有函数。感谢您的提醒,@Glyph。我修正了答案,因为我误解了文档。