Python epollin 的一些问题。

2019-04-26 23:53:28 +08:00
 fghjghf
情况:python3.7,epoll TCP。对端有发送数据,为啥不会触发 select.EPOLLIN ?
然后我打印了下 epoll.poll(),fd 是没错,socket 都对得上。可是为啥 events 就对不上呢?
发现对端发数据,events 是 5,而不是 EPOLLIN 的 4,而我把 python3.7 文档全看了一遍,都没找到 5 是对应那个宏的。
有大佬遇到过吗,是怎么解决的
epoll 事件如下:(这是根据官方文档打印的)
EPOLLIN:1(int)
EPOLLOUT:4
EPOLLPRI:2
EPOLLERR:8
EPOLLHUP:16
EPOLLET:2147483648
EPOLLONESHOT:1073741824
EPOLLEXCLUSIVE:268435456
EPOLLRDHUP:8192
EPOLLRDNORM:64
EPOLLRDBAND:128
EPOLLWRNORM:256
EPOLLWRBAND:512
EPOLLMSG:1024
2134 次点击
所在节点    Python
9 条回复
fghjghf
2019-04-26 23:55:53 +08:00
写错了,EPOLLIN 是 1,而不是 4
pubby
2019-04-27 01:10:51 +08:00
EPOLLIN & EPOLLOUT == 5
weyou
2019-04-27 01:24:43 +08:00
@pubby EPOLLIN | EPOLLOUT == 5
AngryMagikarp
2019-04-27 01:58:08 +08:00
这个标志位是二进制或操作的结果,表示的就是“或”的意思。

比如 5 = 1 | 4 = EPOLLIN | EPOLLOUT = EPOLLIN 或 EPOLLOUT

你拿到 events 时,要判断有没有 EPOLLIN 事件,不能直接 events==EPOLLIN 判断,而要用 events & EPOLLIN 判断。表示 EPOLLIN 标志位是否已经设置,这是典型的 C 语言用法,毕竟 Python 里的 epoll 是移植自 C。

如果你仔细观察,就会发现这些标志的二进制表示都只有一个 1。如下

EPOLLIN: 0x00000001
EPOLLOUT: 0x00000100
EPOLLPRI: 0x00000010
EPOLLERR: 0x00001000
EPOLLHUP: 0x00010000

也正因为如此,才能使用上述的方式将多个标志放在一个 int 里。
AngryMagikarp
2019-04-27 02:01:19 +08:00
上面写错了,二进制应该是 0b 表示,而不是 0x。0x 表示十六进制。

EPOLLIN | EPOLLOUT 表示

0b00000001 | 0b00000100 = 0b00000101 = 5
fghjghf
2019-04-27 11:41:06 +08:00
@AngryMagikarp 感谢,我当初就是直接用 events == EPOLLIN 去判断的。
fghjghf
2019-04-27 13:54:45 +08:00
@AngryMagikarp 但还有个问题,对端发送 send 数据给服务端,为啥只会出发 5 呢,那肯定是谁先写,就先触发谁了,那岂不是 in 和 out 同时触发?这有什么意义呢
AngryMagikarp
2019-04-27 14:22:40 +08:00
@fghjghf 不明白你说的先后的意思。除了 EPOLLIN 和 EPOLLOUT,你还觉得要有什么?

正常情况下写一定是可以的,除非某些原因阻塞了。如果你要把阻塞写的逻辑也考虑进去就会比较复杂。
fghjghf
2019-04-27 15:01:16 +08:00
@AngryMagikarp 我这是 ET+非堵塞模式啦。看了下网上对 demo,终于懂了。原来是我是 in 和 out 一起注册了,才会老是返回 5,这是个错误的写法。应该是先注册 in,while 不断循环,直到 errno.EAGAIN。再注册 out 事件。对于 out 事件也是一样道理。感谢回答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/559108

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX