2016-01-28 3 views
1

Я пытаюсь написать UDP-прослушиватель, который выполняет вызов API в ответ, но на основе данных, содержащихся в полученной датаграмме UDP. Кажется, callMultipleInThreads запускает обе функции в одном потоке. Получив UDP-дейтаграмму, я надеялся, что functionOne завершится как functionTwo запускается в новом потоке (чтобы выполнить вызов API). Это не похоже на это.Как обрабатывать данные за пределами Twisted thread

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() 

Я новичок в написании кода резьбы. Как лучше позволить второй функции не блокировать функциюOne от закрытия? Будет ли разветвление вызова API в funtionTwo лучшим методом?

ответ

0

Как documentation explains, threads.callMultipleInThread будет запускать ваши функции на одном потоке, чтобы они все еще могли блокировать друг друга. Если бы я понял вашу цель, вы должны отложить функцию TwoTwo на свой собственный поток, вместо того, чтобы использовать тот же, что и functionOne. Существует быстрый раздел на how to integrate blocking calls with Twisted, и это использует deferToThread для блокирующего вызова.

Последнее, что я заметил, было осуществлением протокола. Итак, я покажу быстрый фрагмент кода, чтобы продемонстрировать, как запустить functionTwo в новом потоке во время прослушивания для UDP:

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

+1

Это неточно. Под «той же нитью» документация для 'callMultipleInThread' означает, что она будет запускать все функции в одном и том же * нереакторном * потоке. – Glyph

+0

Спасибо за головы, @ Глиф. Я исправил ответ, поскольку неправильно понял документацию. – Shyba

Смежные вопросы