2017-01-17 5 views
-1

Я сценарий 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) 

ответ

0

Это не может быть ваш код.

Вы пользуетесь теми же именами переменных повсюду, и это вас путает (или меня?).

Вы также может сделать это:

def jobs(cmd): 
    for i in folder_list: 
     f = open("/vol01/bin/dir/nohup.out", "w") 
     cmd = "something" 

Вы перезапись переменную параметра CMD, что означает, что рабочие места() не должны иметь переменный параметр.

Ответ на comment1:

import threading as thr 
import time 

def greet(): 
    print("hello world") 

t = thr.Thread(target=greet) 
t.start() 
t.join() 

--output:-- 
hello world 

import threading as thr 
import time 

def greet(greeting): 
    print(greeting) 

t = thr.Thread(target=greet, args=("Hello, Newman.",)) 
t.start() 
t.join() 

--output:-- 
Hello, Newman. 

Ниже эквивалент того, что вы делаете:

import threading as thr 
import time 

def greet(greeting): 
    greeting = "Hello, Jerry." 
    print(greeting) 

t = thr.Thread(target=greet, args=("Hello, Newman.",)) 
t.start() 
t.join() 

--output:-- 
Hello, Jerry. 

И читающий этот код бы спросить, «Почему вы передаете аргумент функции greet(), когда вы ее не используете? "

I'm relatively new to python

Ну, ваш код делает это:

threads = 8 

#Other irrelevant stuff here 

for t in threads: 
    print("hello") 

и что приведет к ошибке:

TypeError: 'int' object is not iterable

Вы знаете, почему?

+0

Я относительно новичок в python, и поэтому, пожалуйста, несите меня здесь. Я в основном пытаюсь определить функцию, которая будет списком (?) Всех моих заданий subprocess.call, и используя функцию потоковой передачи, я могу вызывать каждое задание из предыдущей функции и запускать ее в потоке. В настоящее время задания размещаются последовательно по каждому потоку, а не параллельно.(т. е. одна и та же работа выполняется на каждом потоке). Поэтому я не могу понять, как указать мои аргументы в функции потоковой передачи. Я попытался вызвать функцию без параметра, но он выдал ошибку при определении ее в разделе «target =» потока. – Anuiyer

+0

@Anuiyer: _So Я не могу понять, как указать свои аргументы в функции потоковой передачи. См. Нижнюю часть сообщения. – 7stud