問題タブ [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.

0 投票する
2 に答える
1650 参照

c# - ノンブロッキング キューのテスト

ノンブロッキング キューの疑似コードを C# に移植しました。以下のコードは、論文のほぼそのままのコピーとして意図されています。

実装をテストするには、どのようなアプローチをとりますか?

注: 私は VS2010 で実行しているため、CHESS はまだサポートされていません。

編集:

問題のコードを削除したので、疑うことを知らない開発者はそれを使用しません。バグをなくすにはかなりの数の変更が必要でした...それでも、バグがないと 100% 確信していませんでした。ブルートフォーステストでは、ロックベースのソリューションよりも優れたパフォーマンスを得ることができませんでした.

また、3.5 をターゲットにしているので、4.0 の同時キューで SOL だと思っていました。3.5 RX フレームワークには ConcurrentQueue が含まれているため、これは単なる楽しいプログラミング作業であり、それ以上のものではありません。

0 投票する
2 に答える
918 参照

ruby - Ruby Win32Apiは単一文字のノンブロッキングを取得します

ユーザーからの入力を取得するためのスレッドと、いくつかのシーンをアニメーション化するための別のスレッドの 2 つのスレッドで動作する単純なゲームを作成しようとしています。Enter キーを押さなくても文字を取得できますが、ユーザーがキーを押すまでアニメーション スレッドでブロックされます。キーボードのノンブロッキングから文字を取得する方法を知っている人はいますか?

0 投票する
4 に答える
10161 参照

c# - ノンブロッキング TCP サーバー

それは本当に質問ではありません。私はいくつかのガイドラインを探しているだけです:)私は現在、可能な限り少ない数のスレッドを使用する必要がある抽象tcpサーバーを作成しています。

現在、この方法で動作しています。リスニングを行うスレッドといくつかのワーカー スレッドがあります。リスナー スレッドはただ座ってクライアントが接続するのを待ちます。サーバー インスタンスごとに 1 つのリスナー スレッドがあると予想されます。ワーカー スレッドは、クライアント ソケットですべての読み取り/書き込み/処理ジョブを実行しています。

だから私の問題は、効率的なワーカープロセスを構築することです。そして、私はまだ本当に解決できない問題に直面しました。ワーカーコードは次のようなものです(コードは、私が問題を抱えている場所を示すためだけに非常に単純です):

whileループが何度も繰り返されるため、CPU使用率が100%であっても問題なく動作します。クライアントがsend->receive->disconnectルーチンを実行している場合、それほど苦痛ではありませんが、send->を実行して生き続けようとするとreceive->send->receive を繰り返すと、実際にすべての CPU が消費されます。だから私の最初のアイデアはそこにスリープを置くことでした.すべてのソケットにデータが送信されているかどうかを確認し、Thread.Sleep を POINT2 に 10 ミリ秒だけ入れますが、この 10 ミリ秒後に、次に受信したいときにその 10 ミリ秒の大きな遅延が発生しますクライアント ソケットからのコマンド。

多分それは単に貧弱なアーキテクチャですか?プロセッサーの使用率が 100% にならないようにするにはどうすればよいでしょうか。また、サーバーがクライアント ソケットに表示される何かにできるだけ早く反応するようにするにはどうすればよいでしょうか? たぶん誰かがノンブロッキングサーバーとそれが維持すべきアーキテクチャの良い例を指摘できますか?

0 投票する
2 に答える
4981 参照

linux - LinuxでノンブロッキングTCPconnect()が時々非常に遅いのはなぜですか?

作成しているTCPサーバーの速度を測定しようとしましたが、connect()呼び出しの速度を測定することには根本的な問題がある可能性があることに気付きました。ブロックしない方法で接続する場合は、接続します。 ()操作は数秒後に非常に遅くなります。Pythonのサンプルコードは次のとおりです。

を使用するとNonBlockingConnect、ほとんどのconnect()操作は高速ですが、数秒ごとに1つのconnect()操作が発生します。これには少なくとも2秒かかります(P出力の5つの連続した文字で示されます)。sock.connectすべての接続操作の代わりに使用することによりNonBlockingConnect、高速に見えます。

これらの遅いconnect()をどのように取り除くことができますか?

標準のPAEカーネルでUbuntuKarmicデスクトップを実行しています。

で遅延がないのは不思議ですstrace -f ./conn.py

非常に速くコメントを外しても遅延がないのは不思議ですtime.sleep

私のUbuntuHardyシステムに遅延がないのは不思議です。

これらのシステムはすべて影響を受けます(Ubuntu Karmic、Ubuntu Hardy、Debian Etchを実行):

次のDebianLennyシステムが影響を受けないのは奇妙です。

参考までに、AF_UNIXソケットを使用しても遅延はありません。

参考までに、クライアントをCで実装した場合も、同じ動作が得られます。

0 投票する
2 に答える
1016 参照

c++ - fgets がブロックされるかどうかを確認する

fgets の呼び出しが後でブロックされるかどうかを知るために、C で入力バッファーを覗いたり、同様のトリックを実行したりできるかどうか疑問に思っていました。Java では、BufferedReader.ready() を呼び出すことで、そのようなことを行うことができます。このようにして、次のようなコンソール入力を実装できます。

これにより、外部スレッドは on を false に設定することにより、入力ループを適切にシャットダウンできます。移植性のないトリックに頼らずにCで同様の実装を実行したいのですが、シグナルに頼るか、または(バッファリングの処理を要求しても)再実装することにより、UNIXで「タイムアウトしたfgets」を作成できることはすでに知っていますそれは recv/select の上にありますが、Windows でも動作するものを好むでしょう。

ティア

0 投票する
3 に答える
6650 参照

python - ノンブロッキング リクエストを実行していますか? - ジャンゴ

最近、NodeJS などの他のフレームワークで遊んでいます。

応答を返す可能性があり、さらに操作を行うことができる点が気に入っています。

例えば


Django は、リクエストを返した後に操作を実行する方法を既に提供しているかもしれません。


助けていただければ幸いです。=D

0 投票する
1 に答える
112 参照

file - ブロックせずに 2 つのファイルが順番にフラッシュされるようにする posix-way はありますか?

私のプログラムでは、2 つのファイルを書き込み用に開いたままにします。1 つはデータのチャンクを含むコンテンツ ファイルで、もう 1 つはデータのチャンクがこれまでに書き込まれたマップを含むインデックス ファイルです。

データファイル内のブロックがマップファイル内の対応するブロックの前に(自然に)書き込まれなければならないという唯一の制約付きで、可能な限りパフォーマンスを上げて両方をディスクにフラッシュしたいと思います。

問題は、遅延とスループットの両方の理由から、IE が fsync を実行するのをブロックすることを避けたいということです。

何か案は?

0 投票する
3 に答える
3811 参照

c++ - 非同期イベントループの設計と問題

epoll / devpoll / kqueue / poll / select(windows-selectを含む)を使用して、非同期ソケットIOのイベントループを設計しています。

IO操作を実行するための2つのオプションがあります。

非ブロッキングモード、EAGAINでポーリング

  1. ソケットを非ブロッキングモードに設定します。
  2. ソケットへの読み取り/書き込み。
  3. 操作が成功した場合は、完了通知をイベントループに送信します。
  4. EAGAINを取得した場合は、「選択リスト」にソケットを追加し、ソケットをポーリングします。

ポーリングモード:ポーリングしてから実行します

  1. ソケットを追加してリストを選択し、ポーリングします。
  2. 読み取り可能で書き込み可能であるという通知を待つ
  3. 読み書き
  4. sucseedsのイベントループへの完了通知の投稿

私には、通常モードで使用する場合、特にソケットへの書き込みの場合、最初に必要なシステムコールが少なくなるように見えます(バッファーは非常に大きい)。また、「select」実行の数よりもオーバーヘッドを減らすことができるように見えます。特に、epoll / devpoll/kqueueのように拡張性の高いものがない場合に便利です。

質問:

  • 2番目のアプローチの利点はありますか?
  • Linux、FreeBSD、Solaris、MacOSX、Windowsなどの多数のオペレーティングシステムでのソケット/ファイル記述子の非ブロッキング操作に移植性の問題はありますか?

注:既存のevent-loop/socket-api実装の使用を提案しないでください

0 投票する
4 に答える
19020 参照

.net - MessageBox.Showの非ブロッキングバージョン(またはそのようなもの)はありますか?

長い遅延の更新

私はこの質問に対するMUG4Nの回答を受け入れています。また、MUG4Nに対して提起されたいくつかの批判にも対応したいと思います。

ChrisFは言った:

...バックグラウンドスレッドから直接UI呼び出しを行うことはできません。

これは包括的な声明であり、100%真実ではありません。いくつかの事実を指摘させてください。

  1. を設定すると、実際に必要なすべてのUI呼び出しを行うことができますControl.CheckForIllegalCrossThreadCalls = false「わかった!」あなたが言っているのを聞きます。「そんなことしない!」はい、はい-しかし、なぜですか?答え:これは時々メモリを破壊するからです。

    の制御クラスはSystem.Windows.Formsスレッドセーフになるように記述されていないため、バックグラウンドスレッドから更新するとメモリが破損する場合があります。しかし、これがたまにしか発生せず、常に発生するわけではない場合、これは、UIコード自体の呼び出しではなく、例外を引き起こす可能性のあるUIコードの潜在的に危険な衝突であるということを示しています。

  2. ポイント1を補強するために、これを考慮してください。バックグラウンドスレッドからUIコードを呼び出す「安全な」方法は、Control.Invokeまたはを使用して呼び出すことControl.BeginInvokeです。しかし、これUI呼び出しです; これは、GUI以外のスレッドからGUIを更新する場合に行うことになっているUI呼び出しにすぎません。私が言いたいのは、明らかに、Control混乱を引き起こすのは、外部スレッドからオブジェクトに対して「任意の」メソッドを呼び出すだけではないということです(その場合、呼び出すことさえできず、Invoke完全にスタックします) 。繰り返しになりますが、破壊的であることが判明するのは、同時に安全に発生できない個別のUI呼び出しの潜在的な衝突です。

  3. 上記の2つの点を念頭に置いて、自分自身にMessageBox.Show問いかけてください。GUI以外のスレッドから呼び出すのはなぜ安全ではないのでしょうか。完全に分離されたFormものが作成され、表示されます。そのプロパティは、他の既存のGUIオブジェクトとはまったく相互作用しません。実際、そのプロパティにアクセスする呼び出し元のスレッドから(そしてメソッドの戻り値を介してのみ)、1つを除いて、どのような方法でもどこにもアクセスできません。DialogResultShow

一緒に移動します。コンラートアルブレヒトは言った:

... Show()がDanのref'dトピックに独自のメッセージポンプを設定するという主張を考えると(これは実証されていませんが、私は反論できません)...

これは完全に公正な点です(私は個人的にJared Parを十分に高く評価しているので、彼の言うことを疑う傾向はありません)。いずれにせよ、 ReflectorMessageBox.Showを介してメソッドを覗くと、このスニペットが明らかになります。

メソッドをさらに覗くと、Application.BeginModalMessageLoopこれが明らかになります。

そしてこれThreadContext.FromCurrentは、順番に:

このコードを完全に理解するためのこれらの低レベルのWindows構造については十分にわかりませんが、これは、以前のコメントで参照した回答でJaredが言っていたことの証拠であるように思われます(好奇心旺盛な読者の場合:MessageBoxを実行します。 Show()は自動的にUIスレッドにマーシャルしますか?)。

だから、ええ。私はこれについてMUG4Nに完全に同意します。

(私がまだここで間違っていると誰かが説得力を持って主張できる場合は、声を上げてください。MUG4Nが正しいと信じる理由についてはかなり良い主張をしたと思いますが、100%確実ではありません。)


元の質問

多くの場合、何かが発生したことをユーザーに通知したいだけですが、実際にはユーザーからの入力は必要ありません。この一般的なシナリオでは、次のようなコードが表示されることがあります。

このコードは、ご存知のとおり、[ OK ]ボタンだけで小さなポップアップウィンドウを表示します。これが問題です:このコードブロック(UIスレッド)。しかし、ほとんどの場合、 [ OK ]ボタンしかない場合は、ブロックする必要はほとんどないように思われます。(通常、ブロックの目的はユーザーからの入力を受け取ることではありませんか?ユーザーの唯一の選択肢が「OK」である場合、この典型的なケースでは、ブロックはかなり無意味ではありませんか?)

明らかにMessageBox.Show、何も返さず(no DialogResult)、ブロックしないことを除いて、基本的に正確に実行する独自の小さなフォームを作成できます。でも、知らなかったこのようなものがすでに存在するのではないかと思っていました。

0 投票する
1 に答える
335 参照

java - Javaの場合RandomAccessFileにアクセスしているときにFileChannelからFileLockを取得するための保証された方法は何ですか?

使用しようとしています

FileChannelオブジェクト内javadocに従って、をスローできOverlappingFileLockExceptionます。2スレッドのテストプログラムを作成すると、ロックメソッドはロックの取得を待機しているようです(排他的および非排他的の両方)が、実際のシナリオでスレッド数が増えると、ラッピングファイルロック例外がスローされ、ブロックが原因で処理が遅くなりますファイルロックテーブルで。

OverlappingFileLockExceptionを回避してロックを取得するための最良の方法は何ですか?