Я сценарий linux, который я ищу для автоматизации через подпроцесс. Каждая итерация подпроцесса должна запускать сценарий linux в каждом подкаталоге родительского каталога, и каждый из этих подпроцессов должен работать в отдельном потоке.Использование потоков для параллельного выполнения подпроцесса
Путь организован мой каталог выглядит следующим образом:
- /родитель/p1
- /parent/p2....and так далее до
- /родитель/р [п]
Первая часть моего кода предназначена для запуска процесса во всех подкаталогах (p1, p2, p3 ... и т. Д.). Он отлично работает для быстрого процесса. Однако многие мои задания должны выполняться в фоновом режиме, для которых я обычно использую nohup и вручную запускаю их на отдельном узле. Поэтому каждый узел в моем терминале будет запускать одно и то же задание в каждом каталоге (p1, p2, p3..etc). Последняя часть моего кода (с использованием потоковой передачи) направлена на достижение этой цели, но в конечном итоге все узлы выполняют один и тот же процесс (p1, p1, p1 ... и т. Д.) - в основном по всей функции «заданий» проходит через runSims, когда я хочу, чтобы они были отделены по потокам. Кто-нибудь знает, как я мог бы продолжить итерацию функции потоковой передачи, чтобы размещать разные задания на каждом узле?
import os
import sys
import subprocess
import os.path
import threading
#takes the argument: python FOLDER_NAME #ofThreads
#Example: python /parent 8
directory = sys.argv[1] #in my case input is /parent
threads = int(sys.argv[2]) #input is 8
category_name = directory.split('/')[-1] #splits parent as a word
folder_list = next(os.walk(directory))[1] #makes a list of subdirectories [p1,p2,p3..]
def jobs(cmd):
for i in folder_list:
f = open("/vol01/bin/dir/nohup.out", "w")
cmd = subprocess.call(['nohup','python','np.py','{0}/{1}' .format(directory,i)],cwd = '/vol01/bin/dir', stdout=f)
return cmd
def runSimThreads(numThreads):
threads = []
for i in range(numThreads):
t = threading.Thread(target=jobs, args=(i,))
threads.append(t)
t.start()
#Wait for all threads to complete
main_thread = threading.currentThread()
for t in threads:
if t is main_thread:
continue
t.join()
runSimThreads(threads)
Я относительно новичок в python, и поэтому, пожалуйста, несите меня здесь. Я в основном пытаюсь определить функцию, которая будет списком (?) Всех моих заданий subprocess.call, и используя функцию потоковой передачи, я могу вызывать каждое задание из предыдущей функции и запускать ее в потоке. В настоящее время задания размещаются последовательно по каждому потоку, а не параллельно.(т. е. одна и та же работа выполняется на каждом потоке). Поэтому я не могу понять, как указать мои аргументы в функции потоковой передачи. Я попытался вызвать функцию без параметра, но он выдал ошибку при определении ее в разделе «target =» потока. – Anuiyer
@Anuiyer: _So Я не могу понять, как указать свои аргументы в функции потоковой передачи. См. Нижнюю часть сообщения. – 7stud