[解決済み] サブプロセス呼び出しのブロッキングとノンブロッキング
質問
私は完全に混乱しています。
subprocess.call()
,
subprocess.Popen()
,
subprocess.check_call()
.
どれがブロッキングで、どれがブロッキングでないか?
私が言いたいのは、もし私が
subprocess.Popen()
を使用した場合、親プロセスは子プロセスを待つのか、それとも
return
/
exit
を実行し続ける前に
どのようにして
shell=True
はこれらの呼び出しにどのように影響するのでしょうか?
どのように解決するのですか?
Popen
はノンブロッキングです。
call
と
check_call
はブロック化されます。
をブロックさせることができます。
Popen
インスタンスをブロックさせるには、その
wait
または
communicate
メソッドを使用します。
を見ると
を見ると、ソースコード
を見ると
call
が呼び出されます。
Popen(...).wait()
を呼び出すので、ブロックされているのです。
check_call
が呼び出す
call
を呼び出すので、同様にブロックされます。
厳密には
shell=True
はブロッキングの問題と直交しています。しかし
shell=True
はPythonにシェルを実行させ、そのシェルでコマンドを実行させます。ブロッキングコールを使用した場合、コールが返されるのは
シェル
が終了したときに返されます。シェルはコマンドを実行するためにサブプロセスを生成するかもしれないので、生成されたサブプロセスよりも先にシェルが終了するかもしれません。例えば
import subprocess
import time
proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()
ここでは 2 つのプロセスが生成されています。Popen はシェルを実行している一つのサブプロセスを生成します。シェルは今度は
ls
.
proc.terminate()
を実行するとシェルは終了しますが
ls
を実行しているサブプロセスは残ります。(これは python スクリプトが終了した後でも、大量の出力によって明らかになります。を殺す準備をしておいてください。
ls
を殺す準備をしておいてください。
pkill ls
.)
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] Pythonでサブプロセス.PIPEをノンブロッキングで読み込む
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] shell=True で起動した python サブプロセスを終了させる方法
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?