gpt4 book ai didi

python - 扭曲的回调函数困惑

转载 作者:行者123 更新时间:2023-12-01 06:16:06 24 4
gpt4 key购买 nike

我正在编写一个扭曲的教程,只是为了了解更多 python,但似乎我在这里遇到了障碍。下面的 doRead() 函数是 react 器的“回调”。我不明白的是 except 部分是如何工作的。

我阅读代码的方式是,如果bytes += self.sock.recv(1024)会导致阻塞,那么它将到达代码的以下部分:

if e.args[0] == errno.EWOULDBLOCK:
break

然后它会继续以下内容:

if not bytes:
print 'Task %d finished' % self.task_num
return main.CONNECTION_DONE
else:
msg = 'Task %d: got %d bytes of poetry from %s'
print msg % (self.task_num, len(bytes), self.format_addr())

对我来说,棘手的部分是,如果它被阻止,那么 bytes 变量将不包含任何内容,并且会打印“完成”,但事实并非如此。或者至少它会打印类似“got 0 bytes”的内容,但它也没有。在我看来,当代码遇到来自 recv 调用的 block 时,它几乎会完全跳过上述部分。有人可以解释为什么会发生这种情况吗?

输出是这样的:

Task 1: got 30 bytes of poetry from 127.0.0.1:10000
Task 3: got 10 bytes of poetry from 127.0.0.1:10002
Task 1: got 30 bytes of poetry from 127.0.0.1:10000
Task 3: got 10 bytes of poetry from 127.0.0.1:10002
Task 1: got 30 bytes of poetry from 127.0.0.1:10000
Task 3: got 3 bytes of poetry from 127.0.0.1:10002
Task 1: got 30 bytes of poetry from 127.0.0.1:10000

这是整个函数:

def doRead(self):
bytes = ''

while True:
try:
bytes += self.sock.recv(1024)
if not bytes:
break
except socket.error, e: # I don't understand this part
if e.args[0] == errno.EWOULDBLOCK:
break
return main.CONNECTION_LOST

if not bytes:
print 'Task %d finished' % self.task_num
return main.CONNECTION_DONE
else:
msg = 'Task %d: got %d bytes of poetry from %s'
print msg % (self.task_num, len(bytes), self.format_addr())

self.poem += bytes

整个模块粘贴在这里:http://pastebin.com/bUnXgbCA

最佳答案

重点是,只有当套接字“准备好读取”时,doRead 方法才会被调用:要么它上面有一些数据,要么全部完成(然后,读取将返回0)。因此,问题的解决方案不能在 doRead 函数中 - 一切都在代码中,仅在适当的时候调用它。

该代码全部位于 Twisted“ react 器”中,PoetrySocket 实例将其自身添加到 __init__ 中(通过 react 器的 addReader方法)。顺便说一句,如果您想真正深入地了解 Twisted 的机制,那么您似乎来对地方了(当然,不包括研究 Twisted 的源代码本身;-)。

关于python - 扭曲的回调函数困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274214/

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