問題タブ [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.
events - Postgres : Post ステートメント (または挿入) の非同期、ノンブロッキング処理
行のコレクションが挿入された後、非同期で実行され、非ブロックであり、要求の発信者に結果を通知する必要がない操作を開始することが可能かどうか疑問に思っています。
私は大量のイベントを扱っており、挿入後のロジックが失敗しないことを保証できます。イベント ソースに挿入スレッドを 1 つだけ用意し、このスレッドをブロックせずに飛ばし続けたいと考えています。配達後の簿記については責任を負いません。
これらのジョブを 100 個同時に実行する可能性があり、各ジョブが 5 つのテーブルで動作し、これらのテーブルのそれぞれに 200 ~ 1000 回の挿入があると言えます。
正しい方向へのヒントで十分です。
.net - 低レベルの Web サービス参照呼び出しトランスポートをカスタムのものに置き換えます
タイトルが実際に正しいかどうかわからないので、ここでさらに説明します。私は最初から始めます:)
私は開発に c# と .net を使用しています。
SOAP Web サービスにリクエストを行うアプリケーションがあり、ユーザー リクエストごとに Web サービスに対して 3 ~ 10 のリクエストが生成されます。それらはすべて非同期で実行して一度に完了する必要があるため、Web サービスの Async メソッドを使用します。参照を生成し、コールバックで結果を待ちます。しかし、私が行うすべての非同期呼び出しに対してスレッドを開始する (またはプールから取得する) ように見えるので、10 個のクライアントがある場合、30 から 100 のスレッドを生成する必要があり、16 コアのサーバーでもひどいように聞こえます :)低レベルのトランスポート実装を、ノンブロッキング ソケットを使用し、1 つのスレッドで並列に実行される少なくとも 50 個のソケットをあまりオーバーヘッドなく処理できる独自のものに置き換えたいと考えました。しかし、私は実際にオーバーライドをどこに置くのが最善かわかりません。
クラスを分析System.Web.Services.Protocols.SoapHttpClientProtocol
したところ、実際に使用できる GetWebRequest メソッドがあることがわかりました。オブジェクトが作成するオブジェクトを何らかの方法で中断し、そこからすべてのヘッダーと本文を含む http 要求を取得し、それを自分のソケットで送信できれば..
どのアプローチを使用するかについてのアイデアはありますか? それとも、私が使用できるフレームワークに組み込まれているものがありますか?
asynchronous - Tornadoはノンブロッキング非同期スタイルでCassandraと通信できますか?
私は非常に多くのクライアント要求を処理しなければならないWebプロジェクトに取り組んでいます。そこで、Cassandraとtornadoの使用を検討しています。Tornadoには、http Non-Blockingリクエストを実行できる組み込みクライアント(tornado.httpclient.AsyncHTTPClient)があるようです。ただし、CassandraはThriftプロトコルを使用します。スリフトを使用して、カサンドラに征服している間、トルネードはブロックされているようです。
誰か経験がありますか?どうしたらいいか提案してください。または、この目的のためのアドオンモジュールはありますか?
ありがとう。
python - Python:スレッド化されたサブプロセスのstdoutからのノンブロッキング読み取り
バッファリングされていない出力を次の形式で出力するスクリプト(worker.py)があります...
ここで、nは、このスクリプトのループが行う一定の反復回数です。別のスクリプト(service_controller.py)で、いくつかのスレッドを開始します。各スレッドは、subprocess.Popen(stdout = subprocess.PIPE、...);を使用してサブプロセスを開始します。ここで、メインスレッド(service_controller.py)で、各スレッドのworker.pyサブプロセスの出力を読み取り、それを使用して、完了までの残り時間の見積もりを計算します。
私はworker.pyからstdoutを読み取り、最後に出力された数値を決定するすべてのロジックを動作させています。問題は、これをブロックしない方法で行う方法がわからないことです。定数bufsizeを読み取ると、各読み取りは各ワーカーからの同じデータを待機することになります。fcntl、select + os.readなどを使用するなど、さまざまな方法を試しました。ここでの最善のオプションは何ですか。必要に応じてソースを投稿できますが、説明で問題が十分に説明されていると思いました。
ここで助けてくれてありがとう。
編集
サンプルコードの追加
サブプロセスを開始するワーカーがいます。
次に、ThreadManagerがあります。
そしてそれを実行するためのいくつかのコード。
問題を特定するために、他のコードのログを削除しました。
python - epoll と python 3.1 で非同期 http リクエストを行う方法
更新: 独自の非同期 Web サーバーの作成 (Dave Beazley によるプレゼンテーションに続く) など、Py3 で多くの作業を行った後、最終的に Python (および私のコードの膨大なスタック) をダンプしました。調べてみてください: GitHub (最近のすべての興味深いコードの 95% がここにあります)、npm (ユーザー フレンドリーとは言えなかったパッケージ マネージャー; よくやったeasy_install
、あなたは自分の名に恥じない)、めちゃくちゃモジュールの巨大なリポジトリ (事実上 24 時間 365 日公開されている大量の新しいものを含む)、巨大で活気のあるコミュニティ、すぐに使える非同期 HTTP とファイル処理...、これらすべて ( V8のおかげで)の 3 分の 1 で光の速度—何が気に入らないのですか?プロパガンダの続きを読む: 「スクリプティングの未来」 (スライド ホスティング提供: SpreeWebdesign )。
Python 3 で asnchronous / non-blocking / AIO http サービスを実行する方法に関する興味深いページhttp://scotdoyle.com/python-epoll-howto.htmlがあります。
非ブロッキングhttpクライアントを含むtornado Webサーバーがあります。サーバーの一部を python 3.1 に移植することはできましたが、クライアントの実装にはpyCurlが必要であり、問題があるようです(参加者の 1 人は、「Libcurl は首が痛い」と述べ、信じられないほど醜い pyCurl を見ています。ページ pyCurl がすぐに py3+ に登場するとは思えません)。
epoll が標準ライブラリで利用できるようになったので、Python を使用して非同期 http リクエストをすぐに実行できるはずです。私は本当に非同期コアなどを使用したくありません。epoll は、このタスクに最適なツールであるという評判があり、Python ディストリビューションの一部であるため、非ブロッキング http に epoll 以外のものを使用することは非常に直感に反します (気が向いたら、私が間違っていることを証明してください)。
ああ、私はスレッド化が恐ろしいと感じています。スレッドなし。私はスタックレスを使用しています。
非同期 http のトピックにさらに興味がある人は、PyCon2010 でのピーター・ポルタンテによるこの講演をお見逃しなく。また興味深いのは基調講演で、スピーカーの antonio rodriguez はある時点で、最新の Web テクノロジ ライブラリを標準ライブラリに含めることの重要性を強調しています。
ほとんどのリソースを消費せずに高いスループットを達成する方法はたくさんあるかもしれません。ただし、スレッド (およびその他の部分的に古いメソッド) を放棄すると考えているのは私だけではありません。google skipfish プロジェクトの人々も同じように考えているようです。彼らは、skipfish は
一部のマルチスレッド クライアントに存在するメモリ管理、スケジューリング、および IPC の非効率性を排除する、シングルスレッドの完全非同期ネットワーク I/O およびデータ処理モデルの多重化。
c - Winsock でデータを受信する
現在、オンライン ゲームのネットワークをプログラミングしていますが、データの受信についてどうすればよいかよくわかりません。問題は、パケットのサイズを実際に推測できないことです。そのため、パケットからわずか 4 バイトを読み取り、それらを int に変換して、パケットのサイズを知ることを考えました。次に、そのサイズのバッファを作成し、残りのパケットを受信しますが、それは良い考えですか?
参考までに、ノンブロッキング I/O を使用しています。
python - Pythonで受信ソケットを実行するときにjythonを使用することに関する質問
Python とネットワーク プログラミングの知識があまりありません。現在、ユーザーから送信されたテキスト メッセージを受信し、Google 検索 API から情報を取得し、結果をテキスト メッセージでユーザーに返すことができる単純なアプリケーションを実装しようとしています。このアプリケーションは、ユーザーのメッセージをリッスンし続け、すぐに返信します。
ユーザーから送信されたテキストショートメッセージを取得するにはどうすればよいですか? これは、中国のモバイル サプライヤーが提供する fetion という名前のプログラムです。クライアント側の機能は、インスタント コミュニケーション ツールのように、モバイルを使用して SMS を送受信している他のユーザーとの間でメッセージを送受信できます。
fetion プログラムをシミュレートするオープン ソースの python プログラムを使用しています。基本的に、この python プログラムを使用して、SMS 経由で携帯電話を使用している他のユーザーと通信できます。
私のコア プログラムは Java に基づいているため、この Python プログラムを Java 環境に取り込む必要があります。私はjythonを使用していますが、Javaコードのいくつかの行でユーザーにメッセージを送信できるようになりました.
しかし、本当の問題は、SMS を介してユーザーから受信するプロセスです。Python コードでは、新しいスレッドが作成され、ユーザーを継続的にリッスンします。Python では問題ないはずですが、Jython で同様のプロセスを実行すると、次の例外が発生します。
Python コードの 150 行目は次のとおりです。
私はPython、特にソケット部分に精通しておらず、Jythonの使用も初めてなので、本当にあなたの助けが必要か、アドバイスや説明だけが必要です.
どうもありがとうございました!
java - Java-非ブロッキング呼び出しの処理
私のアプリケーションでは、サードパーティのAPIを使用しています。これは、すぐに戻るノンブロッキングメソッドです。このメソッドを呼び出さなければならない要素のコレクションがあります。
今、私の問題は、すべてのメソッドの実行が完了するまで方法を見つけて、次の操作を実行する必要があることです。どうすればこれを処理できますか?サードパーティのAPIを変更できません。
要するにそれはこのように見えます
multithreading - スレッドがある場合にノンブロッキング受信の使用例はありますか?
非ブロッキング受信がメッセージパッシングであまり使用されていないことは知っていますが、それでもいくつかの直感は、それが必要であることを教えてくれます。GUIイベント駆動型アプリケーションを例にとると、プログラムが計算を実行できるように、ブロックしない方法でメッセージを待つ何らかの方法が必要です。これを解決する方法の 1 つは、メッセージ キューを持つ特別なスレッドを用意することです。スレッドがある場合でも、非ブロッキング受信が本当に必要になるユースケースはありますか?
sql-server - SQL Serverトランザクションでレコードレベルのロックを使用するにはどうすればよいですか?
何年も前に、もともとデスクトップアプリとして作成されたアプリケーションがあります。編集画面を開くたびにトランザクションを開始し、[OK]をクリックするとコミットし、[キャンセル]をクリックするとロールバックします。これはデスクトップアプリでは問題なく機能しましたが、現在はADO.NETとSQL Serverに移行しようとしており、長時間実行されるトランザクションには問題があります。
複数のユーザーがすべて同じテーブル(の異なるサブセット)を同時に編集しようとすると、問題が発生することがわかりました。古いデータベースでは、各ユーザーのトランザクションは、トランザクション中に変更したすべてのレコードに対するレコードレベルのロックを取得していました。さまざまなユーザーがさまざまなレコードを編集していたため、全員が独自のロックを取得し、すべてが機能します。ただし、SQL Serverでは、1人のユーザーがトランザクション内のレコードを編集するとすぐに、SQLServerはテーブル全体をロックしているように見えます。2番目のユーザーが同じテーブル内の別のレコードを編集しようとすると、最初のユーザーがコミットまたはロールバックするまでSqlConnectionがブロックされるため、2番目のユーザーのアプリは単にロックアップします。
長時間実行されるトランザクションが悪いことは承知しています。最善の解決策は、これらの画面を変更して、トランザクションを長時間開いたままにしないようにすることです。しかし、それは侵襲的でリスクの高い変更を意味するので、このコードをそのまま稼働させる方法があるかどうかも調査したいと思います。そうすれば、自分の選択肢が何であるかがわかります。
SQL Serverで2人の異なるユーザーのトランザクションを取得して、テーブル全体ではなく個々のレコードをロックするにはどうすればよいですか?
これは、問題を説明する手っ取り早いコンソールアプリです。「test1」というデータベースを作成しました。「Values」というテーブルが1つあり、ID(int)列とValue(nvarchar)列だけがあります。アプリを実行すると、変更するIDを要求され、トランザクションが開始され、そのレコードが変更されてから、Enterキーを押すまでトランザクションが開いたままになります。できるようになりたい
- プログラムを起動し、ID1を更新するように指示します。
- トランザクションを取得してレコードを変更します。
- プログラムの2番目のコピーを開始し、ID2を更新するように指示します。
- 最初のアプリのトランザクションがまだ開いている間に、更新(およびコミット)できるようにします。
現在、アプリの最初のコピーに戻ってアプリを閉じるか、Enterキーを押してコミットするまで、手順4でフリーズします。command.ExecuteNonQueryの呼び出しは、最初の接続が閉じられるまでブロックされます。
動作に変更を加えずに、私がすでに試したいくつかのことを次に示します。
- トランザクション分離レベルを「コミットされていない読み取り」に変更する
- UPDATEステートメントで「WITH(ROWLOCK)」を指定する