問題タブ [multiprocess]
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.
c++ - QProcess: プロセスの実行中に破棄されました
2D プロット ライブラリである xmgrace へのカスタム コントロール インターフェイスを開発するために Qt を使用しています。私のプロジェクトには 3 つのコンポーネントがあります。
- Qtで作られたGUI
- バックグラウンド スレッドで C からいくつかの共有オブジェクト コードを実行する QThread。
- パイプを使用して上記の両方に接続された xmgrace ウィンドウ。(grace_np ライブラリを使用)
からの通信(1) --> (2)
は、共有オブジェクト コードで宣言されたいくつかのグローバル変数のステータスを変更することによって行われます。
(1) --> (3)
&からの通信(2) --> (3)
は、grace_np ライブラリによって提供される組み込み関数を使用しています。
今、(2) --> (1)
問題を引き起こしているのは からの通信です。考えられる2つの方法を試しました:a)Qtシグナルを発行し、Cコード内で呼び出されるQtコードで共有オブジェクトを宣言します。b) スレッドから戻り、戻り値を使用して何らかの操作を実行してから、スレッドを再起動します。
これらの方法論はどちらも信頼できない結果をもたらしました。GUI が動かなくなったり、セグメンテーション エラーが発生したりして、次のメッセージが表示されます。
QProcess: Destroyed while process is still running
コードのどこにも QProcess クラスを使用していません。だからこれは謎になった。これについて考えられる原因について、いくつかの情報を提供してください。
PS: へのパイプ(3)
は一方向であり、その方向のみが必要です。
編集1:
参考までに、私は Qt 4.2 を使用しているため、QObject アプローチを使用してから movetothread() を使用することはできません。会社のポリシーのためにコードを配置できず、コードを配置していないため、申し訳ありません。何を入れるかを知っています(大きすぎます)。共有の C コードは 40 万行以上
私は自分の問題の犯人を見つけたと信じています。クラス QMessageBox を使用すると、この問題が発生するようです。最初は QMessageBox の静的関数を使用していました。スタックとヒープの両方で宣言しようとしましたが、問題は解決しません。しかし、コードから QMessageBox へのすべての呼び出しを削除すると、問題が解決することがわかりました。しかし、問題は、メッセージを表示するにはどうすればよいかということです。私はここで推測していますが、QMessageBox のモーダルな性質が私のプログラムと xmgrace の間に存在するパイプをブロックし、その後終了させる可能性はありますか? 次に、カスタム QMessageBox (非モーダル) を作成すると、この問題が解決する場合があります。
編集2:
ワーカー スレッドから QMessageBox を呼び出しているわけではありません。さらに、ワーカー スレッドを使用している方法では、プログラムを閉じない限り戻りません。アイデアを与えるために、私の QThread::run 関数は次の形式です。
ここで、c_init と c_run は共有 C コードからリンクされた関数です。そのため、これらの中から QMessageBox を直接呼び出すことはできません。今のところ、QMessageBox を廃止し、代わりに QMainWindow ステータス バーを使用する予定です。しかし、それではすべての機能が提供されるわけではありません。これはQt 4.2のバグである可能性があると思います
編集3:
からの通信(2) --> (1)
が問題の原因であると前述しました。今、私はこの通信を完全に廃止し、ワーカー スレッドの開始後にいつでも QMessageBox を呼び出すことによって問題が発生することをより正確に発見しました。上記の通信により、Qt が間接的にシグナルを送信し、QMessageBox を呼び出していましたが、これが原因であると私は信じています。
編集4:
わかりました、最初からこの問題を取り巻く最大の謎について言及するのを忘れていました。私は基本的に、このプログラムをコーディングして実行するワークステーション(Place B)でssh経由で作業(Place A)します。B は 2 つの物理ネットワークに接続されています。A はネットワーク 1 を介して B に接続されています。現在、A の端末から作業している間 (つまり、ネットワーク 1 経由の ssh)、この問題は発生していません。ただし、B に直接アクセスするか、ネットワーク 2 経由で ssh を介してアクセスすると、一貫して発生します。コードが B でのみ実行されるたびに注意してください。これらのネットワークは両方とも百人隊長によって使用されています。
編集 5
最後に、QMessageBox の拡張機能を実際には必要としないため、QDialog をサブクラス化し、カスタム MessageBox を作成することで問題を解決しました。QMessageBox 内で正確に何が問題を引き起こしているのか、まだわかりません。常に謎のままであるQt内のバグを推測します。
ruby-on-rails - ruby on rails - 同じ列を更新する異なるプロセスIDを持つ遅延ジョブ
私は問題を発見しました。それはロックとは何の関係もありませんでした。本番環境では、ジョブがあったようです。作業は永続的に実行され、それは呼び出されました。方法がわかりません! したがって、そのプロセスによって処理されるすべてのジョブは、別の場所で何かを行うことになります! そして、それは私のデータベースではないので、それを強制終了して、すべて正常に動作し始めました。
すみません、無駄遣いをしてしまいました!!
Rails 2.3.8 で作業していることを忘れていました。
異なるバックグラウンド プロセスから同じ行、同じ列を非同期で更新しています。私はdelayed_jobs gemを使用しています。
私がやりたいことは次のとおりです。
私のデータベースは mysql で、書き込むテーブルは InnoDB です。
問題は、そのクエリを異なるdelayed_jobsで実行すると、データの増分が失われることです。(column = column + #{updated_number}) テーブルの現在の値をインクリメントしたい!
各遅延ジョブは異なるプロセスで実行されるため、Rails ロックの使用は機能しません。テーブルに安全に更新を行うためのロックがいくつかある場合のように考えていました。
もう 1 つ、lock! を使用して、私の開発コードで、rake の job:work を 3 回実行します。次に、delayed_job テーブルで、3 つの異なるプロセスが 3 つのジョブをロックしていることを確認し、それが完全に機能する開発コードです。
しかし、そのコードを本番環境に置くと、機能しません。増分データの損失はまだ残っています。
linux - 以前に起動された場合、プロセスの起動を防ぐ方法は?
認証プロセスを含むいくつかのプロセスを持つアプリケーションがあります。接続が確立され、認証が成功した場合、認証の起動を防ぐ必要があります。この動作を実装するにはどうすればよいですか? プラットフォーム - Linux。
powershell - マルチプロセッシング exec の Powershell のしきい値まで
SSIS パッケージを呼び出す文字列配列に複数のコマンドがあります。ハードウェアを活用するために、一度に多くのパッケージを実行し、1 つのパッケージが完了するまで待ってから別のパッケージを追加したいと考えています。SOに関する他の同様の質問を見ると、次のようなものがうまくいくと思います:
これにより、6 つのメモ帳を開くことができますが、あるしきい値 (この例では 2) まで待機しません。理想的には、メモ帳の 1 つを閉じるまで待機する必要があります (つまり、プロセスが終了します)。
誰もこれを以前にやったでしょうか?
python - 多数のプロセスを使用するが、CPU の数を制限する Python でのマルチプロセッシング
関数 A を介して処理する必要がある多数のデータ ファイルがあります。たとえば、1000 個のファイルがあるとします。各ファイルの各プロセスは、6 GB のメモリで 15 分未満で済みます。私のコンピューターには 32GB と 8 つの CPU があるため、安全のために一度に最大 4 つのプロセス (24GB のメモリと 4 つの CPU) を使用できます。私の質問は、Python でマルチプロセス パッケージを使用して 4 つのプロセスを作成し、各プロセスが関数 A を継続的に取得して、下の図のようにデータ ファイルを個別に処理できるかどうかです。各 CPU が約 1 を処理しなければならないことは明らかです。250ファイルですが、1000ファイルのファイルサイズは異なり、必ずしもそうではありません. プロセスが終了すると、他のプロセスが終了しているかどうかに関係なく、すぐに新しいジョブが割り当てられることに注意してください。つまり、4 つのプロセスすべてが同時に終了するまで待機時間はありません。関数 A の戻り値はここでは重要ではありません。コードを教えてください!ご提案ありがとうございます。
python - PyDev と settrace が静かに壊れる
Python サブプロセス (マルチプロセスで起動) をデバッグしようとしています。次のコードのみを含む単純なプロジェクトを作成し、リモート デバッガーを起動してから、プロジェクトを起動しました。settrace ステートメントで Eclipse が壊れることを期待しています。
最初の print ステートメントからの出力は表示されますが、2 番目のステートメントからの出力は表示されず、ブレークは実行されません。
次に、settrace() に "suspend" パラメーターを False で送信しました。
今回は、両方のメッセージが期待どおりに表示されます。次に、2 番目の print ステートメントにブレークポイントを設定し、再度実行しました。これで、2 番目のメッセージは表示されなくなりました。
したがって、Eclipse が本来の実行を中断しているように見えますが、制御を私に返していません。私が見逃しているものはありますか?
python-2.6 - ループがpythonプロセス内の変数への値の受け渡しを中断している間
私はマルチプロセッシングが Python でどのように機能するかを学ぼうとしており、私の理解をテストするための非常に単純なスクリプトを作成しました。
プロセス内で while ループの後に発生する値の割り当てが完了していないように見えるという事実を除いて、すべてが正常に機能しているように見えます。
while ループを for ループに置き換えるか、完全に削除すると、すべてが期待どおりに機能するように見えます。
main.py は次のとおりです。
そして、timepieces.py ファイル (プロセスを作成および制御するクラスが含まれています):
どんな考えでも大歓迎です。
ruby - ruby net-sftp を使用してファイルを非同期 (並列) にアップロードする方法
sftp を使用してファイルを並行してアップロードする最良の方法は何ですか?
マルチスレッドとマルチプロセスを使用することが唯一のオプションですか?
そのために宝石を使用できますか?
Ruby 1.8.6 を使用しています。