5

共通のソケットで複数の greenlet を送信しています。経由で送信された各パッケージが適切に分離されていることが保証されていますsocket.sendallか、それとも を呼び出すたびにロックを取得する必要がありますかsendall?

したがって、次のシナリオを防止したいと考えています。

  • g1送信ABCD
  • g2送信1234
  • 受信データが混在しているなどAB1234CD
  • ABCD1234または_1234ABCD

アップデート

ソースコードを見た後、このシナリオは起こり得ないと思います。しかし、g1 または g2 が でクラッシュする可能性があるため、ロックを使用する必要がありsendallます。誰かがこれを確認できますか?

4

1 に答える 1

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このエラーが発生しない修正済みのテスト スクリプトを次に示します。

于 2012-12-10T10:38:21.403 に答える