【问题标题】:How to chain functions using reactor in python?如何在python中使用reactor链接函数?
【发布时间】: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


【解决方案1】:

这个例子中关于线程的反应器的使用是完全不正确的。只有在调用 reactor.run 的同一线程中调用 Twisted API 才是安全的。

在您的示例中,startReactorsendMsearch 在不同的线程中被调用。前者调用reactor.run,后者使用其他Twisted API。

如果您想将 Twisted 与其他阻塞 Python 代码集成,您可能需要查看 https://pypi.python.org/pypi/crochet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2023-03-31
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多