Как запустить скрипт Python для множественного ввода на нескольких ядрах одновременно? - PullRequest
0 голосов
/ 05 июня 2019

У меня 28 входных файлов и 28 доступных процессоров.Я написал скрипт на python, который использует подпроцесс для анализа входных файлов с помощью QualityAnalysisMain_v2.py.Прямо сейчас он отлично работает на одном процессоре.То, что я хотел бы сделать, это запустить pararell каждый входной файл на одном CPU - 28 запускается одновременно.

Я попробовал подход здесь: Python, распространяющий subprocess.call на нескольких ядрах процессора

особенно этот код:

import threading
import subprocess

def worker():
    """thread worker function"""
    print 'Worker'
    subprocess.call(mycode.py, shell=inshell)
    return

threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

здесь:

for pliki in os.listdir(input_data):
    nazwa = pliki.split(".")[0]
    subprocess.call("mkdir " + output_data + nazwa, shell=True)

def SubprocessFiles():
    for pliki in os.listdir(input_data):
        print("python QualityAnalysisMain_v2.py " + input_data + pliki)
        subprocess.call("python QualityAnalysisMain_v2.py " + input_data + pliki, shell = True)
        return

threads = []
for i in range(28):
    t = threading.Thread(target=SubprocessFiles)
    threads.append(t)
    t.start()

Но это закончилось синтаксическим анализом первого ввода 28 раз ...

Вот мой код - скрипт выполняется для каждого файла во входном каталоге, но на одном процессоре:

for pliki in os.listdir(input_data):
    nazwa = pliki.split(".")[0]
    print("python QualityAnalysisMain_v2.py " + input_data + pliki)
    subprocess.call("mkdir " + output_data + nazwa, shell = True)
    subprocess.call("python QualityAnalysisMain_v2.py " + input_data + pliki, shell = True)

Большое спасибо за любые предложения.

лучше всего, Агата

1 Ответ

0 голосов
/ 05 июня 2019

Вы передаете один и тот же список всем потокам, поэтому все начинаются с начала списка. Вместо этого вы должны передать одно имя файла каждому из них:

def SubprocessFiles(pliki):
        print("python QualityAnalysisMain_v2.py " + input_data + pliki)
        subprocess.call("python QualityAnalysisMain_v2.py " + input_data + pliki, shell = True)
        return

threads = []
for i, pliki in enumerate(os.listdir(input_data)):
    t = threading.Thread(target=SubprocessFiles, args=[pliki])
    threads.append(t)
    t.start()
...