3

CとPythonの2つのプロセスがあります。C プロセスは、Python プロセスが読み取る名前付きパイプにデータを渡すのに時間を費やします。非常にシンプルで、1 秒に 1 回データ (現在は「2013 年 8 月 19 日月曜日 18:30:59」などのタイムスタンプ) を渡すと正常に動作します。

sleep(1) を削除すると問題が発生します。C プロセスのコマンド。1 秒の遅延もない場合、通信はすぐに台無しになります。Python プロセスは、バッファーが空であっても、複数のメッセージを読み取るか、データを読み取ったことを報告します。この時点で、C プロセスは通常爆撃します。

サンプル コードを投稿する前に、両側で何らかの同期を実装する必要があるかどうか疑問に思っています。fifo が空でない場合、C プロセスに fifo に書き込まないように指示するようなものでしょうか。

C プロセスは名前付きパイプを書き込み専用で開き、Python プロセスは読み取り専用で開きます。

両方のプロセスは、ループとして実行されることを意図しています。C プロセスは、USB ポート経由で受信したデータを継続的に読み取り、Python プロセスは各「メッセージ」を受け取り、それを解析してから SQL Db に送信します。

毎秒最大 50 件のメッセージを表示する場合、名前付きパイプはそのレベルのトランザクション レートを処理できますか? 各トランザクションのサイズは比較的小さい (20 バイト程度) ですが、その頻度から、共有メモリなどの他の形式のプロセス間通信を検討する必要があるのではないかと思います。

アドバイスをいただければ幸いです。必要に応じてコードを投稿できますが、現時点では、2 つのプロセス間で何らかの方法で同期する必要があるかどうか疑問に思っています。

ありがとう!

4

1 に答える 1

2

パイプはストリームです。

送信側の呼び出しの数はwrite()、必ずしも受信側の の数に対応する必要はありませんread()

ある種の同期プロトコルを実装してみてください。

プレーンテキストを送信する場合は、たとえば、各トークンの間に改行を追加して、そのようなものが見つかるまで受信者に読み取らせることができます。

別の方法として、送信されるデータの量を表す固定長の数値を送信する各データにプレフィックスを付けることもできます。その後、受信者はこの形式を解析できます。

于 2013-08-19T18:08:50.590 に答える