[英]How to run 10 python programs simultaneously?
我有a_1.py
~ a_10.py
我想並行運行 10 個 python 程序。
我試過:
from multiprocessing import Process
import os
def info(title):
I want to execute python program
def f(name):
for i in range(1, 11):
subprocess.Popen(['python3', f'a_{i}.py'])
if __name__ == '__main__':
info('main line')
p = Process(target=f)
p.start()
p.join()
但它不起作用
我該如何解決這個問題?
我建議使用subprocess
模塊而不是multiprocessing
:
import os
import subprocess
import sys
MAX_SUB_PROCESSES = 10
def info(title):
print(title, flush=True)
if __name__ == '__main__':
info('main line')
# Create a list of subprocesses.
processes = []
for i in range(1, MAX_SUB_PROCESSES+1):
pgm_path = f'a_{i}.py' # Path to Python program.
command = f'"{sys.executable}" "{pgm_path}" "{os.path.basename(pgm_path)}"'
process = subprocess.Popen(command, bufsize=0)
processes.append(process)
# Wait for all of them to finish.
for process in processes:
process.wait()
print('Done')
如果你只需要調用10個外部py
腳本( a_1.py
〜 a_10.py
)作為一個單獨的進程-使用subprocess.Popen類:
import subprocess, sys
for i in range(1, 11):
subprocess.Popen(['python3', f'a_{i}.py'])
# sys.exit() # optional
值得看看豐富的subprocess.Popen
簽名(你可能會發現一些有用的參數/選項)
您可以使用多處理池來同時運行它們。
import multiprocessing as mp
def worker(module_name):
""" Executes a module externally with python """
__import__(module_name)
return
if __name__ == "__main__":
max_processes = 5
module_names = [f"a_{i}" for i in range(1, 11)]
print(module_names)
with mp.Pool(max_processes) as pool:
pool.map(worker, module_names)
max_processes
變量是在任何給定時間工作的最大工人數。 換句話說,它是您的程序產生的進程數。 pool.map(worker, module_names)
使用可用進程並在 module_names 列表中的每個項目上調用 worker。 我們不包含 .py,因為我們通過導入來運行模塊。
注意:如果要在模塊中運行的代碼包含在if __name__ == "__main__"
塊中,這可能不起作用。 如果是這種情況,那么我的建議是將a_{}
模塊的if __name__ == "__main__"
塊中的所有代碼移動到main
函數中。 此外,您必須將工作人員更改為以下內容:
def worker(module_name):
module = __import__(module_name) # Kind of like 'import module_name as module'
module.main()
return
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.