問題タブ [long-running-processes]
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.
asp.net-mvc-2 - 次のシナリオで非同期コントローラーを使用できますか?
Asp.net MVCにアプリケーションがあり、ある時点で、プロセス実行の進行状況インジケーターを表示するモーダルダイアログをユーザーに表示したいと思います。
舞台裏のプロセスは、多くのデータベースデータ処理を実行します(既存のデータに基づいて、データベースに書き戻される多くの結果レコードを生成します)。プロセスには、短時間から非常に長い時間までかかる場合があります(既存のデータによって異なります)。
アプリケーションはこのプロセスを非同期で(Ajaxリクエストを介して)開始し、同じ方法で進行状況を表示します。
問題
プロセスを非同期的に開始してプロセスの終了を通知する非同期コントローラーについて少し読んだことがありますが、進行状況が表示されず、ブラウザーのタイムアウトがどのように処理されるかがよくわかりません。クライアントが行く限り、非同期リクエストは同期リクエストと同じです。したがって、クライアントは応答を待ちます(私が理解しているように)。主な違いは、サーバーが非同期で何かを実行するため、他の着信要求をブロックしないことです。私が実際にすべきことは次のとおりです。
- プロセスを開始し、プロセスが開始されたクライアントに応答するリクエストを作成します。
- クライアントは定期的にサーバーをポーリングしてプロセスの進行状況を確認し、パーセンテージ値(おそらくJSONとして)で即座に応答を返します。
- 進捗状況が100%になると、それは終了したことを意味するため、クライアントは結果を要求する必要があります。
非同期コントローラーがこのように機能するとは確信していません...
問題は、非同期コントローラーを理解していることがよくわからないため、今説明したように、この問題にどのアプローチを使用すべきかわからないということです。私は2つの可能性を自分で見ています。
- Asp.netMVC非同期コントローラーがこのように機能する場合
- 要求に応じてデータを処理し、その進行状況を報告するWindowsサービスアプリ-このサービスは、通常のコントローラーアクションを使用して特定のレコードをDBに書き込むことによって開始されます。それが開始され、サービスが進行状況をDBに書き込むため、Asp.netMVCアプリはクライアントプロセスのポーリング要求でそれを読み取ることができます。
android - UI を更新する別のスレッドで長時間実行されるプロセス
dot NET でも同様の問題に気付きましたが、私の問題は Android の問題なので、解決策が異なるように見えるかもしれません。
ボタンをクリックすると、プロセスがアクティブになります。プロセスは UI スレッドの一部として実行され、最後に UI の更新を行いました。進行状況ダイアログを追加してユーザー フレンドリーにしたので、プロセスを実行するスレッドをインスタンス化し、最後に UI を更新して進行状況ダイアログを閉じます。残念ながら、UI の更新は以下の例外で失敗します。
UI スレッドをブロックし、長いプロセスが終了して UI を更新した後でそれを解放しようとすると、進行状況ダイアログが表示されません。代わりに別のスレッドで進行状況ダイアログを表示しようとする必要がありますか、それとも別の簡単な解決策がありますか?
php - PHP CLI スクリプトがハング状態であることを検出する方法
スーパーバイザー (http://supervisord.org/) を使用して、かなり標準的な PHP スクリプトをデーモン化しています。スクリプトは次のような構造になっています。
今日、このスクリプト (かなり安定しています) がハングしました。これは、supervisord にプロセスを再起動するように警告するようなクラッシュ (つまり、SIGHUP または SIGTERM シグナルの発行) はしませんでした。処理中にエラーは発生しませんでした。これは、スクリプトによってキャッチされるか、少なくとも致命的なエラーをトリガーして終了した可能性があります。これらの「キャッチ可能な」シナリオの代わりに、それはただそこに座っていました. PHP スクリプトはメモリの観点からリークが多く、実行時間が長い場合は再起動するのが適切であることが一般的に認められているため、supervisorctl フックを介してスクリプトを再起動するために 1 時間ごとに実行する cron ジョブをセットアップしています。その再起動後、スクリプトは正常に動作を再開しました。
私の質問: このスクリプトがハングしたことをどのように検出できますか? なんらかの方法でその状態を警告されない限り、なぜハングしたのかというこの問題の診断やトラブルシューティングを開始することさえできません。これに対するソフトウェア ソリューション、または自分でソリューションを作成するためのアプローチ (PHP、Python、perl、またはシェルのいずれか) を探しています。
スクリプトは PHP 5.2.6 で書かれており、最新の RHEL 5 サーバーで実行されます。
より素晴らしいソリューションに役立つ場合は、追加情報を共有できるかどうかお知らせください。
ありがとうございました!
シャヒーブ R.
twisted - Twisted で長時間実行プロセスを生成する方法
序文
Cで書かれたプログラムへのアクセスをユーザーに提供するWebサーバーを作成しています(このCプログラムでPythonラッパーを使用しています、それはPyCLIPS です)。多くのユーザーにサービスを提供するには、Web サーバーはこの C プログラムの多くのコピーを開始する必要があります。これは、1 つのコピーが同時に非常に少数のユーザー (約 1 ~ 3 ユーザー) にサービスを提供できるためです。さらに、各ユーザーは自分のコピーのみを使用して作業する必要があるため、C プログラムのコピーが多数存在する必要があります。
この C プログラムは、理解するのに役立つ場合はCLIPS エンジンです。
したがって、この設計上の問題を解決するために、長時間実行されるプロセスのプールのような Twisted TCP サーバーを書きたいと思います。long-running-processes のそれぞれは、C プログラムの 1 つのコピーへのアクセスを提供する小さな Twisted TCP サーバーです。
たとえば、ユーザーがプールサーバーに長時間実行プロセスを予約するように依頼すると、プールサーバーは長時間実行プロセスを作成して実行し、ポートでリッスンを開始すると、プールサーバーはホストを返しますこの長時間実行プロセスをユーザーに移植します。これで、ユーザーはこの長期実行プロセスと直接通信できます。
質問
- これらの長時間実行プロセスをプール サーバーから開始するにはどうすればよいですか? プールサーバーと各長時間実行プロセスは、別々の Twisted サーバーにする必要があります。
- Twisted はこれらの目的に適していますか?
- この設計上の問題を解決する別の方法があるのではないでしょうか?
どうもありがとう。
objective-c - GCDとUIBackgroundTaskIdentifier
いくつかの作業が含まれているディスパッチキューがあります。アプリケーションがバックグラウンドに移行したときに、時間がなくなるかキューが空になるまで、キューを実行し続けたいと思います。UIBackgroundTaskIdentifierをどのように設定しますか?
そのようにディスパッチブロックに入れる必要がありますか?
上記で起こったことは、キューが実際にブロックを実行するまで、長時間実行タスクとして登録されないことだと思います。それで、実際にキューに入れられる前に実行されるように、コードの背景部分をブロックの外側に配置する必要がありますか?
c# - Windows サービスが正常にシャットダウンするのに何時間もかかることはありますか?
非常に重要なデータを大量に A から B にトランザクション方式で移動する .NET Windows サービスがあります。また、サービスで使用されるすべての外部コンポーネントが正しく割り当て解除され、サービス自体をシャットダウンする前にすべてがクリーンアップされていることを確認する必要があります。これには何時間もかかることがあります。これは、2、3、または 4 時間後に到着する外部コンポーネントのコールバックをサービスが待機する必要があるためです。
- サービスが正常にシャットダウンするまで Windows が長時間待機する可能性はありますか?
- サービスがオペレーティングシステムによってシャットダウンされているときに何が起こるかを指示できるサービスのオプションはありますか?たとえば、シャットダウンを完全に防止しますか?
- また、別のシナリオとして、サーバーを再起動する必要がある場合はどうなりますか? サービスを何時間も待つことはできますか?
- OS がサービスを強制終了するまで待機する時間に制限はありますか?
c# - 長時間実行プロセスのインターロック
ユーザーが次のようなことができる webservice+servicebus プロジェクトを作成しています
このメソッドはすぐに戻りますが、バスを介して操作の要求を送信します。
私の問題は、別のユーザーが既に実行されているときに、複数のユーザーが同じ aggregateId で長いプロセスを要求したときに始まります。
私が考えている解決策は、継続的Queue<LongProcessTask>
に実行され、実行する必要がある操作を探すタスクです。そのため、一度に1つのプロセスのみを実行するか、将来の実装は異なるaggregateIdの場合は複数のプロセスになります。
このようにして、同じ集計で長時間実行されるプロセスが重複することはありません。
他のアイデア?
.net - 長時間実行プロセスの.NET自動テスト
外部ソースにデータを送信し、データがWebサイトに正しく表示されていることを検証する必要があるプロセスの自動統合テストを実行したいと思います。
ただし、データがWebサイトに表示されるまでに数時間かかる場合があります。
従来のNUnitまたはMSTestの問題は、テストが結果を待つために何時間も保留されることです。
すべてのテストを並行して実行するために使用できるPNUnitを見たことがありますが、それは私には洗練された解決策ではないようです。1000のテストがある場合はどうなりますか?これにより、サーバー上に大量のプロセス/スレッドが作成されませんか?そして、それらすべてを追跡する方法。
それで、誰かがこの問題を解決しましたか?あなたは家で解決策を育てましたか、それともこれに対するオープンソースの解決策はありますか?
unix - 長時間実行コマンドの連続出力を解析します
同様の質問が見つからなかったので、投稿することにしました
私は長期にわたる仕事をしています(* nix環境):
これは数日にわたって実行され、出力をチャンクで出力します。「job.out」の代わりに、チャンク化された出力を変更し(たとえば、タイムスタンプを追加する)、それをjob.outに書き込むスクリプト(おそらくPerl?)を使用できますか?