Twisted/Amp网络:响应所有客户,而不仅仅是一个提出请求的客户

2024-05-04 15:38:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力学习如何绕过这些新式的“工厂”式网络库。Twisted获得了很多好评,但对我来说绝对是一场噩梦,因为我不熟悉lambda,因此我真的不知道如何遵循演示代码所做的。在

演示客户端:

from twisted.internet import reactor, defer
from twisted.internet.protocol import ClientCreator
from twisted.protocols import amp
from ampserver import Sum, Divide


def doMath():
    d1 = ClientCreator(reactor, amp.AMP).connectTCP(
        '127.0.0.1', 1234).addCallback(
            lambda p: p.callRemote(Sum, a=13, b=81)).addCallback(
                lambda result: result['total'])
    def trapZero(result):
        result.trap(ZeroDivisionError)
        print "Divided by zero: returning INF"
        return 1e1000
    d2 = ClientCreator(reactor, amp.AMP).connectTCP(
        '127.0.0.1', 1234).addCallback(
            lambda p: p.callRemote(Divide, numerator=1234,
                                   denominator=0)).addErrback(trapZero)
    def done(result):
        print 'Done with math:', result
    defer.DeferredList([d1, d2]).addCallback(done)

if __name__ == '__main__':
    doMath()
    reactor.run()

演示服务器:

^{pr2}$

据我所知,客户机p.callRemote(Sum, a=13, b=81)p.callRemote(Divide, numerator=1234, denominator=0)部分调用Math.sum(13, 81)和{},因为工厂对象的protocol被设置为Math类。当客户机从服务器接收到返回值时,会调用子函数Done(result),它将内容打印到屏幕上。在

这很好,但是我的理解力很差,而且每一篇文档似乎都期望得到这样的理解。在

我真正想做的是将数据从一个客户机发送到一个服务器,从一个服务器发送到多个连接的客户机。此方法似乎在交换结束后就忘记了客户机,并且reactor.run()阻塞了客户机,使它无法执行任何其他工作。在

人们可能每天都希望得到这个功能。我怎么理解?在

编辑:我尝试过让客户机调用一个“check-in”函数,但这似乎会让我的服务器淹没在请求中,仅仅是响应“无需报告”。此外,它还增加了延迟,因为客户机只在请求时接收新数据,而不是在实际可用时接收。factory-reactor布局似乎没有暴露我需要存储的客户机信息,以便对它们进行任意响应。在


Tags: lambdafromimport服务器客户机deftwistedresult
1条回答
网友
1楼 · 发布于 2024-05-04 15:38:26

你似乎有三个问题:

  1. lambda在Python中是什么意思?”在

    它是covered by Python's documentation。如果您仍然很难阅读这样编写的代码,那么可以使用这样一个事实,lambda x: y只是编写def my_function(x): return y的快捷方式。在任何你看到lambda的地方,例如,这个:

    def foo(bar):
        return boz().addCallback(lambda result: qux(bar, result))
    

    您总是可以将lambda拉到它自己的函数中,这样您就更容易阅读了,如下所示:

    ^{2美元
  2. “{a2}”

    它是documented by Twisted's FAQ

  3. How do I make Twisted talk to multiple clients / connect to multiple servers?

    它是also a twisted FAQ。这里的基本思想是reactor.run()意味着“。。。然后运行整个程序”。在reactor.run()之前运行任何代码的唯一原因是设置初始计时器、侦听套接字或第一次连接。您可以在运行reactor之前或在程序稍后发生的任何回调中调用connectTCPlistenTCP任意多次。

相关问题 更多 >