gevent,套接字和同步

时间:2012-12-07 08:39:05

标签: python sockets gevent

我在一个公共套接字上发送了多个greenlet。是否保证通过socket.sendall发送的每个包都是完全分开的,或者在每次调用sendall之前我必须获取锁定。

所以我想阻止以下情况:

  • g1 发送ABCD
  • g2 发送1234
  • 收到的数据已混淆,例如AB1234CD
  • 预期为ABCD12341234ABCD

更新

看了sourcecode之后,我认为这种情况不可能发生。但我必须使用锁,因为g1或g2可能会在sendall上崩溃。有人可以证实这一点吗?

1 个答案:

答案 0 :(得分:2)

我使用高延迟/低带开关接口进行了一些测试并得到了预期的错误。

这导致(如预期)出现以下错误:

AssertionError: This event is already used by another greenlet: (<Greenlet 
at 0x7f3e758722d0: <bound method socket.sendall of <socket at 0x7f3e7587719
0 fileno=8 sock=127.0.0.1:1234 peer=127.0.0.1:51042>>('11111111111111111111
11111111111111111111111111111)>, timeout('timed out',))

以下是包含gevent.coros.RLock的固定测试脚本,不会产生此错误:https://gist.github.com/4249827/7f02f805331eda4091ae0b39dfea4b102cdba2fa