簡體   English   中英

如何同時運行 10 個 python 程序?

[英]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.pya_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM