Python 如何处理扭曲线程之外的数据

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

我正在尝试编写一个UDP侦听器,它执行API调用作为响应,但基于接收到的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()
我不熟悉编写线程代码。如何更好地允许第二个函数不阻止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。我修正了答案,因为我误解了文档。