gpt4 book ai didi

python - 扭曲的回调循环阻止接收更多数据

转载 作者:行者123 更新时间:2023-12-02 01:37:57 25 4
gpt4 key购买 nike

当回调循环在 Twisted 中运行时,我的印象是 react 器仍然能够从服务器发送/接收数据,因为它能够在回调“之间”运行。但是,当我运行下面的脚本时,它完全忽略了 self.transport.write() 行。该服务器只是 Twisted 在其网站上拥有的基本回显服务器。

from twisted.internet import reactor, protocol
from twisted.internet.defer import Deferred


class EchoClient(protocol.Protocol):

deferred = Deferred()

def connectionMade(self):
self.deferred.addCallback(self.doThing)
self.deferred.callback(0)

def doThing(self, _):
print 'xxx'
self.transport.write('Hello, world!')
self.deferred.addCallback(self.doThing)

def dataReceived(self, data):
"As soon as any data is received, write it back."
print "Server said:", data
self.transport.loseConnection()


class EchoFactory(protocol.ClientFactory):

protocol = EchoClient


def main():
f = EchoFactory()
reactor.connectTCP('192.168.0.7', 8000, f) # Correctly connected to my server
reactor.run()

if __name__ == '__main__':
main()

我期望一个,甚至几个,'xxx's 被打印出来,然后服务器发送一个回显 'Hello, world!'回到我身边,然后更多'xxx's。相反,我得到的是无限滚动的“xxx”,甚至没有尝试发送“Hello,world!”到服务器。我错过了什么/误解了什么?

最佳答案

问题是您的示例从不让主循环运行。

建立连接后,您将回调添加到 self.deferred - 我不确定 self.deferred 应该代表什么操作,但显然没有有用。

然后您立即(同步)回调 self.deferred。这会立即执行 doThing,它会调用 self.transport.write。这会向输出缓冲区添加一些字节,以便在主循环下次运行时发送。然后,在该回调中,您立即(同步)向 self.deferred 添加另一个回调,该回调将在当前回调完成后立即运行。所以我们进入 doThing,它调用 self.transport.write。我们还没有写任何东西,更不用说读取任何东西以传递给 dataReceived,因为我们还没有回到主循环。但是我们向那个 Deferred 添加了另一个回调。再次调用 doThing

这将永远持续下去,当您缓冲不断增加的传出流量时,在传输上分配无限量的内存,但绝不允许程序从 connectionMade 返回,让它返回到主循环,并等待可写性和可读性事件。

我不知道如何修复这个程序,因为不清楚你试图做什么,但不管是什么,都不是这样:)。

关于python - 扭曲的回调循环阻止接收更多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29948217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com