【发布时间】:2014-05-20 12:27:01
【问题描述】:
我的代码:
class Server(DatagramProtocol):
SSDP_ADDR = "239.255.255.250"
SSDP_PORT = 1900
MS = "M-SEARCH * HTTP/1.1\r\nHOST: {}:{}\r\nMAN: 'ssdp:discover'\r\nMX: 2\r\nST: ssdp:all\r\n\r\n".format(SSDP_ADDR, SSDP_PORT)
def __init__(self, iface):
self.iface = iface
self.Thread = None
self.Thread = threading.Thread(target=self.startReactor)
self.Thread.setDaemon(True)
self.scanThread.start()
def startReactor(self):
"""
"""
reactor.callFromThread(self.sendMsearch)
if reactor.callWhenRunning(lambda: None) is not None:
reactor.run(installSignalHandlers=0)
def sendMsearch(self):
""" Sending M-SEARCH message
"""
d = defer.Deferred()
port = reactor.listenUDP(0, self, interface=self.iface)
port.write(Server.MS, (Server.SSDP_ADDR, Server.SSDP_PORT))
d = reactor.callLater(2.5, port.stopListening) # MX + a wait margin
d.addCallback(self.cleanUp)
def cleanUp(self, x):
"""
"""
# stop thread and cleanup
def datagramReceived(self, datagram, (host, port)):
# doing some work
在上面的代码中,我必须在完成 port.stopListening 后调用 cleanUp()。
还有我怎样才能杀死这个帖子
这里可以链接吗?
如果没有,那么如何在这里实现我的目标。
【问题讨论】:
-
呃...我想您可能在这里混淆了一些概念。我无法想象你为什么会尝试通过
callFromThread调用def,然后在其中尝试并执行reactor.listenUDP(看起来你在sendMsearch内部也有一些逻辑错误)......主要扭曲的重点是执行避免线程的异步代码......除非您解释为什么线程的东西在那里(以及现在运行它时会发生什么),否则我无法直接回答您。简而言之,deferrers是您安排 def 在其他事情完成后运行的方法。 -
@MikeLutz 实际上我有另一个 python 程序正在运行我的工具,它调用这个服务器对象
标签: python-2.7 twisted deferred chaining