如何在Twisted线程之外处理数据

时间:2016-01-28 07:11:52

标签: python twisted twisted.internet

我正在尝试编写一个UDP侦听器,它在响应中执行API调用,但是基于接收到的UDP数据报中包含的数据。似乎callMultipleInThreads在一个线程中运行两个函数。在收到UDP数据报后,我希望functionOne会在functionTwo以新线程启动时结束(进行API调用)这似乎并非如此。

{{1}}

我是编写线程代码的新手。怎么能更好地允许第二个功能不阻止functionOne关闭?是否会在函数中调用API函数?这是一种更好的方法吗?

1 个答案:

答案 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