【问题标题】:Make a twister server take initiative让twister服务器主动
【发布时间】:2011-09-20 16:07:19
【问题描述】:

我有一个扭曲的服务器,实现LineReceiver 协议。 当我调用sendLine 以响应客户端消息时,它会立即将该行写入客户端,正如人们所期望的那样。

但是假设客户端要求服务器进行冗长的计算。我希望服务器定期向客户端发送进度消息。当服务器主动调用sendLine而客户端没有请求任何东西时,它似乎在发送任何东西之前等待客户端向服务器发送消息。

如何在不让客户端明确要求的情况下立即从服务器向客户端发送消息?

【问题讨论】:

  • 请记住,只有当您使用reactor.callInThread 时,您的函数/方法才会在单独的线程中运行。回调和错误回调。默认情况下,一切都在反应器线程中运行。在你的代码中描述 who-calls-who 关系可能会有所帮助。
  • 让服务器“主动”:天网的一切不都是这样开始的吗?

标签: python twisted


【解决方案1】:

如果您以异步方式执行计算,请使用延迟。
其他方式,如果它是在单独的线程中进行一些长时间的计算,可以说是 deferrToThread(),使用 reactor.callFromThread()
(我假设我们不会在主循环中进行大量计算 - 这是非常非常错误的 :)) 小例子:

def some_long_foo(data_array, protocol):
    def send_msg(msg, protocol):
        # It actually looks petter in classes without pushing protocol here and
        # there
        protocol.transport.write(msg)

    for n, chunk in enumerate(data_array):
        do_something_cool(chunk)
        if n and (n % 10 == 0):
            from twisted.internet import reactor
            # here send_msg will be safely executed in main reactor loop
            reactor.callFromThread(send_msg, '10 more chunks processed',
                                   protocol)

# Somwhere in lineReceived we start long calculation
def cb(result):
    self.transport.write('got result: {}'.format(result))
d = threads.deferToThread(some_long_foo, data_array, self)
d.addCallback(cb)

因此,现在我们将通知客户端每 10 块数据处理一次,然后最终将结果发送给他。 代码可能有点不正确,它只是例如

docs

统一更新: 只是为了澄清: 错过了 sendLine 部分。一般没关系,调用它 insted of transport.write()

【讨论】:

    【解决方案2】:

    您可以随时使用sendLine 发送一条线路,它应该会立即到达,但您可能遇到与服务器阻塞有关的问题。

    sendLine 的调用被延迟,因此如果您在一堆处理过程中进行调用,则可能有一段时间没有被执行,然后当消息被收到时 em>,reactor 中断处理,接收消息,获取队列中发送的消息,然后再返回处理。您应该在此处阅读其他一些答案,并确保您的处理不会阻塞您的主线程。

    【讨论】:

      【解决方案3】:

      如果“立即”是指“客户端连接时”,请尝试在您的 LineReceiver 子类的 connectionMade 中调用 sendLine

      【讨论】:

      • 不。我的意思是在一个完全随机的时间,在客户端连接之后的某个地方。我有一种扭曲的感觉,总是在等待客户“做”某事(连接、发送消息……),然后再响应它。我会尽量澄清我的问题。
      猜你喜欢
      • 2011-02-09
      • 2016-02-21
      • 2021-12-16
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2017-07-03
      相关资源
      最近更新 更多