gevent、插座和同步器

2024-10-01 15:38:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个greenlet在一个公共套接字上发送。是否保证通过socket.sendall发送的每个包都被很好地分隔开来,还是在每次调用sendall之前都必须获得一个锁。在

所以我想防止以下情况:

  • g1发送ABCD
  • g2发送1234
  • 接收到的数据被混淆,例如AB1234CD
  • 应为ABCD1234或{}

更新

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


Tags: 数据情况socketgreenletabcdsourcecodeg1g2
1条回答
网友
1楼 · 发布于 2024-10-01 15:38:38

我用高延迟/低带宽开关接口做了一些测试,得到了预期的错误。在

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

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

相关问题 更多 >

    热门问题