問題タブ [nonblocking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sockets - MSG_PEEKを使用したノンブロッキングrecvが成功した場合、MSG_PEEKを使用しない後続のrecvも成功しますか?
これが私が取り組んでいるいくつかのコードの簡略化されたバージョンです:
recvへの最初の呼び出しが成功し、1〜32の値を返すと仮定した場合、2番目の呼び出しも成功すると仮定しても安全ですか?ret2をret1より小さくすることはできますか?どちらの場合?
(わかりやすくするために、recvへの2回目の呼び出し中に他のエラー状態がないと仮定します。シグナルが配信されない、ENOMEMが設定されない、などです。また、他のスレッドがfdを参照しないと仮定します。
私はLinuxを使用していますが、ここでLinux固有のものはMSG_DONTWAITだけだと思います。正しいfnctlが他のプラットフォームで以前に設定されていると想定します。)
c++ - WinSocks でのノンブロッキング connect()
MSDNによると、次のようなノンブロッキング ソケットを作成する必要があります。
その後、 write-fdset で使用しselect()
ます。接続が成功したかどうかを確認するには、ソケットが書き込み可能かどうかを確認する必要があります。ただし、MSDN の記事には、エラーをチェックする方法が記載されていません。
connect()
が成功しなかったかどうか、またそうである場合、成功しなかった理由を確認するにはどうすればよいですか?
ruby - Ruby IO インスタンスが read() でブロックされるかどうかを確認する簡単な方法はありますか?
基本的にこれであるRubyのメソッドを探しています:
IO
特定のオブジェクト (私の場合は呼び出しの結果) に出力があるかどうかを確認したいだけですpopen
。つまり、フォローアップ呼び出しio.read(1)
がブロックされません。
これらは私が見る 2 つのオプションですが、どちらも好きではありません。
io.read_nonblock
- Unix の抽象化が薄すぎる --エラー処理を扱いread()
たくありません。errno
io.select
with timeout 0 -- この単純な操作の目的を曖昧にします。
私が見落としていたより良い代替手段はありますか?
ruby - Rubyでgetc/getを使用せずにキーが押されたことを検出(非ブロッキング)
ファイルシステムで何かが変更されるのを待つ必要がある単純なタスクがあります(これは基本的にプロトタイプ用のコンパイラです)。したがって、変更されたファイルをチェックした後、5秒間スリープする単純な無限ループがあります。
敬礼の代わりにCtrl+C
、ループをブロックすることなく、キーが押されたかどうかをテストして確認できるようにしたいと思います。基本的に、キーが押されているかどうかを確認する方法が必要です。次に、Qが満たされるまでキーを押してから、プログラムを終了します。
私が欲しいのは:
それとも、これはRubyが(うまく)できないことですか?
perl - IO :: Selectスレッドセーフのselect()ラッパーですか?回避方法は?
私がスレッドを持っているとしましょう:
にタイムアウトを指定しておらずselect()
、記述子(「ハンドル」)セットの1つでアクティビティが検出されるまで無期限にブロックされるため、別のスレッドがセットの内容を変更した場合(たとえば、ポーリング用の新しいソケットを追加した場合)はどうなりますか?
Perl POSIXスレッドの実装と比較して、スレッドセーフな方法で実装されていますか?
そうでない場合は、ブロッキングselect()
呼び出しを独自のスコープを持つブロックに固定して、セット、またはよりクリーンなパッケージデータ全体をロックできると思います。select()
セットの内容を操作できるように、別のスレッドからウェイクアップして戻るための最良の方法は何ですか?スレッド固有のシグナル?セマフォ?提案を歓迎します。
どうもありがとう!
編集:まあ、スレッド固有の「シグナル」が出ています。ここで説明されているように(http://perldoc.perl.org/threads.html):「それに応じて、スレッドにシグナルを送信しても、スレッドが現在作業している操作は中断されません。シグナルは、現在の操作の後に処理されます。たとえば、スレッドがI / O呼び出しでスタックしている場合、信号を送信してもI / O呼び出しが中断されることはなく、信号はすぐに実行されます。」
それでもselect()
、一定のタイムアウト後に戻るのではなく、スレッドを無期限にブロックしたい場合、スレッドでウェイクアップする問題をどのように処理すればよいのか疑問に思います。
c# - C#でファイアアンドフォーゲットメソッドを実行する最も簡単な方法は?
私はWCFでそれらが[OperationContract(IsOneWay = true)]
属性を持っているのを見ました。しかし、WCF は、ノンブロッキング関数を作成するためだけに、遅くて重いようです。理想的には static void nonblocking のようなものがあるでしょうがMethodFoo(){}
、それは存在しないと思います。
C#でノンブロッキングメソッド呼び出しを作成する最も簡単な方法は何ですか?
例えば
NB : これを読んでいる人は、メソッドを実際に終了させたいかどうかを考えるべきです。(#2 の一番上の回答を参照) メソッドを終了する必要がある場合、ASP.NET アプリケーションなどのいくつかの場所では、スレッドをブロックして存続させるために何かを行う必要があります。そうしないと、「忘れたが実際には実行されない」という事態に陥る可能性があります。その場合、もちろん、コードをまったく記述しない方が簡単です。(これが ASP.NET でどのように機能するかについての適切な説明)
java - Java 用のプッシュベース/ノンブロッキング XML パーサーはありますか?
InputStream または InputSource から解析する代わりに、テキストのブロックをパーサーにプッシュできるようにする XML パーサーを探しています。たとえば、次のようなものが欲しいです。
その理由は、ブロックする InputStream をサポートするために必要な接続モデルごとにスレッドに戻すのではなく、NIO ネットワーク ライブラリでうまく機能するものが欲しいからです。
c++ - ノンブロッキング Unix ソケットの高速化 (C++)
簡単なソケット ラッパー クラスを実装しました。非ブロッキング機能が含まれています。
このクラスには、単純な受信関数も含まれています。
実際には、Socket::recv() が呼び出されると、約 15 ミリ秒の遅延があるようです。この遅延は避けられますか? select() を使用するノンブロッキングの例をいくつか見たことがありますが、それがどのように役立つかわかりません。
bash - bashでFIFOをブロックしない問題
私はいくつかのTeamFortress2サーバーを実行していて、小さな管理スクリプトを書きたいと思っています。
基本的に、TF2サーバーはサーバーコンソールを提供するfgプロセスであるため、サーバーを起動し、ステータスを入力して、サーバーから回答を得ることができます。
これで、コマンドsm_reloadadminsをすべてのサーバーに送信するスクリプトを作成したいと思います。これを行うために私が見つけた最良の方法は、パイプという名前のFIFOを使用することです。今私がやりたいのは、このパイプを読み取り専用にし、サーバープロセスをブロックしないようにすることです。これにより、パイプに書き込み、サーバーがそれを実行できますが、それでもサーバーの1つをコンソール経由で書き込みたいので、サーバーのfgプロセスとステータスを入力して回答を印刷します。
私はこれを試しました(serverfifoがmkfifo serverfifoであると仮定します):
動作していない場合、パイプに何かが書き込まれるまでサーバーは起動しません。
これは実際にはかなりうまく機能しています。サーバーのコンソール出力を確認でき、FIFOに書き込むことができ、サーバーはコマンドを実行しますが、コンソールを介してサーバーに書き込むことはできなくなります。また、パイプ(サーバーを終了する必要があります)に「exit」と記述し、それを画面で実行している場合、何らかの理由で画面ウィンドウが強制終了されます(wtfはなぜですか?)。
サーバーがブロックせずにFIFOを読み取る必要があるだけで、サーバー自体のすべてのキーボード入力をサーバーに送信し、すべてのサーバー出力をコンソールに書き込む必要があります。
それは可能ですか?はいの場合、どのように?