一般讨论socket的并发安全性,都是指线程的安全性。。。而且绝大多数的情况下socket都不是线程安全的。。
当然一些框架可能会对socket进行一层封装,让其成为线程安全的。。。例如java的netty框架就是如此,将socket封装成channel,然后让channel封闭到一个线程中,那么这个channel的所有的读写都在它所在的线程中串行的进行,那么自然也就是线程安全的了。。。。。
其实很早看Gevent的源码的时候,就已经看过这部分的东西了,当时就已经知道gevent的socket不是协程安全的,也就是说gevnet的socket不能在不同的协程中同时读取或者写。。。。
例如我们不能同时在两个协程中调用socket.recv方法。。。。
不过好像自己现在已经忘了,那就再看看,顺便写篇博客记录下来,以防以后又忘记了,还找不到资料
那么为什么呢。。?我们来分析一下源代码吧,这里就拿send方法来分析,先来看看gevent的send方法的定义:
#这里发送数据不会保证发送的数据都发送完,而是能发送多少发送多少
#然后返回发送的数据大小
def send(self, data, flags=0, timeout=timeout_default):
sock = self._sock
if timeout is timeout_default:
timeout = self.

本文探讨了Gevent的socket并发安全性,指出Gevent的socket并非协程安全,不能在不同协程中同时进行读写操作。通过分析Gevent的send方法和相关源码,揭示了原因在于socket的写事件watcher机制,当无法发送时会等待_write_event,而这一过程涉及到协程的切换,从而导致非线程安全。
最低0.47元/天 解锁文章
2978

被折叠的 条评论
为什么被折叠?



