質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

Q&A

2回答

5536閲覧

PowerShell から Python をバックグラウンド実行する

IOError

総合スコア25

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

0グッド

0クリップ

投稿2020/11/19 12:02

編集2020/11/19 12:04
内容

PowerShellを使用して、同時に複数のPythonを並列実行したいと考えています。
Start-Jobを使用しましたが、並列ではなく直列で実行されている状況です。
調べても原因がわかっていないため、アドバイスをいただきたくご質問です。

実行の流れ
  1. PowerSell から .\Execute.ps1を実行
  2. Execute.ps1 がバックグラウンドで Before.pyを実行
  3. Execute.ps1 がバックグラウンドで After.pyを実行

PowerShell

1# ファイル名:Execute.ps1 2 3$py_before = {py -3 Before.py} 4$py_after = {py -3 After.py} 5 6# バックグラウンド実行 7Start-Job -Name "py_before" $py_before 8Start-Job -Name "py_after" $py_after 9 10# バックグラウンドJobの終了を待つ 11Get-Job -name "py_*" | Wait-Job | Receive-Job 12 13# Jobの終了 14Remove-Job -name "py_*" -force

python

1# ファイル名:Before.py 2 3import time 4 5for i in range(5): 6 print("before: " + str(i)) 7 time.sleep(3) 8print("before: finish")

python

1# ファイル名:After.py 2 3import time 4 5for i in range(5): 6 print("after: " + str(i)) 7 time.sleep(3) 8print("after: finish")
実行結果

PowerShell

1before: 0 2before: 1 3before: 2 4before: 3 5before: 4 6before: finish 7after: 0 8after: 1 9after: 2 10after: 3 11after: 4 12after: finish
期待する実行結果

並列で実行されることを期待しているため、以下のような出力がされることを想定しています。

PowerShell

1before: 0 2after: 0 3before: 1 4after: 1 5before: 2 6after: 2 7before: 3 8after: 3 9before: 4 10after: 4 11before: finish 12after: finish

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ループ内のprintで時刻を表示させてみれば並列実行されていることが分かります。

行が混ざらないのは、receive-jobが直列で実行されるからでしょう。

投稿2020/11/19 12:37

otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/11/19 12:38

かぶったか。
IOError

2020/11/19 13:25

otn さん 毎度ご回答いただきありがとうございます。 今回の原因が Receive-Job 側にあるとは思いもよりませんでした。 (終了を待つだけで、途中のログは混ざって表示されるものと思い込んでいました) 特に並列処理実行時には、タイムスタンプを表示することで確認できることも新たな観点として覚えておきます。 ありがとうございました。
guest

0

Receive-Job でジョブ毎に取得しているだけです。
次のように、時間を出力してみてください。

Python

1# ファイル名:Before.py 2 3import time 4 5for i in range(5): 6 print("before: " + str(i) + ": " + str(time.time())) 7 time.sleep(3) 8print("before: finish")

出力

before: 0: 1605789093.1365125 before: 1: 1605789096.1372843 before: 2: 1605789099.1381838 before: 3: 1605789102.1381881 before: 4: 1605789105.1382692 before: finish after: 0: 1605789093.2033725 after: 1: 1605789096.2043052 after: 2: 1605789099.2047946 after: 3: 1605789102.205457 after: 4: 1605789105.2055109 after: finish

投稿2020/11/19 12:33

Zuishin

総合スコア28662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IOError

2020/11/19 13:21

Zuishin さん ご回答いただきありがとうございます。 Receive-Job が Job ごとに結果を出力しているだけで、内部的には並列で処理されていたんですね。 Start-Job の呼び出し方に問題があるとばかり思い込んでおりました。 勉強になりました、ありがとうございます。
IOError

2020/11/19 14:32

Zuishin さん たびたび申し訳ありません。 手元でタイムスタンプを表示させたのですが、載せていただいた通りにならず、before: 4: xxx の3秒後に after: 1: xxx が表示されていました。 そもそも環境に依存するようなことがあるのでしょうか。 (特にスレッド数に関する設定等)
Zuishin

2020/11/19 14:39

何か変えましたか?
IOError

2020/11/19 14:42

Zuishin さん いえ、python の print にタイムスタンプを追加しただけです。
Zuishin

2020/11/19 14:44

Execute.ps1 をこの質問からコピペして上書きしてみてください。
IOError

2020/11/19 14:49

Zuishin さん それも行ってみましたが、やはり after: 1 のタイムスタンプは befre: 4 の3秒後になっています。
Zuishin

2020/11/19 14:53

実際に使っているスクリプトをすべて質問に掲載し、結果もコピペしてください。あと $PSVersionTable と。
Zuishin

2020/11/21 01:07 編集

ログインしているのに返事がないということは、やっぱり違うものを動かしているわけですね。 Start-Job は内容を別プロセスで起動して自身はすぐに終了します。一番目のジョブの終了を待ってから次のジョブを起動するようなことはしません。 Execute.ps1 が同じものだとしたら、Python スクリプトの方でロックのかかった処理をしているなどの原因で、スクリプト自身が同期しているか、リソース不足など何らかの原因で遅延実行されているかが考えられます。どちらもこのコードで起こるとは考えにくいものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問