3

Rebol 3 で非同期 IO イベント システムを開始する一般的な方法は、ポートで待機することです。タイムアウトをチェックするために、スキームからの値が待機ブロックに追加されます。

wait [port timeout]

ただし、小さな電子メール メッセージのデフォルトのタイムアウトは、数メガバイトのファイルには適切でない場合があります。

これを処理する最良の方法は何ですか? まだデータを受信して​​いる場合、不必要にタイムアウトしないように、スクリプトがデータを受信して​​いる間に待機リストを更新できますか?

4

3 に答える 3

5

ポートのタイムアウトは、完全なリクエストではなく、パケットのタイミングに基づいてトリガーする必要があると思います。つまり、メールに 30 秒のタイムアウトを設定すると、30 秒間パケットを受信して​​いないことになります。

パケットは小さい傾向があるため、すぐに到着します。長期間受信しない場合は、ネットワーク/サーバーの障害を示しており、タイムアウトを取得する必要があります。(例外は、パケットの集約が発生している場合ですが、それでも、通常は長い遅延が発生するほど多くの集約は行われません。)

そうは言っても、それらがR3に実装されているかどうかはわかりません。前のコメントに基づいて、私はそうではないと思います。ネットワーキング システムは、私が R3 用に書いた最初の部分の 1 つで、無駄がなく意地悪でしたが、確かに注意が必要でした。

于 2013-05-28T00:46:28.877 に答える
1

これはまだ実装されていないようです。この投稿http://www.rebol.net/wiki/Ports_and_Schemes:_Issues issue 9: timeouts で、Carl は言います

デバイス モデルによって実装される下位レベルのポートには、タイムアウト機能が既に含まれています。現在有効になっていませんが、有効にする必要があります。これにより、CONNECT や READ などのアクションとそれに関連するタイムアウトの最初の要件が満たされます。この方法では、一般的なタイマー ポートを使用しません。これは、下位レベルのポート デバイスが、そのようなポートに対して上位レベルの呼び出しを行うことに問題があるためです。

より高いレベルでは、そのようなポートに TIMER スキームを提供することを常に計画してきました。基本的なタイミング コードとカーネル レベルのウェイクアップ メカニズムが (Win32 システム API 用に) 既に実装されているため、すぐに利用できるようになるはずです。

于 2013-03-24T06:52:52.623 に答える
0

ループはどうですか?永久に [ [ポート 1] を待つ if magic-port-has-data? ポート [プロセス] ]

于 2013-01-31T04:15:07.440 に答える