使用线程并行运行子进程

时间:2017-01-17 01:38:02

标签: python linux multithreading subprocess

我是一个linux脚本,我希望通过子进程实现自动化。子进程的每次迭代都应该在父目录的每个子目录中运行linux脚本,并且每个子进程应该在一个单独的线程中运行。

我的目录组织方式如下:

  • / parent / p1
  • / parent / p2 ....等等
  • /父/ P [N]

我的代码的第一部分旨在跨所有子目录(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)

1 个答案:

答案 0 :(得分:0)

那可能不是你的代码。

import os
import sys
import subprocess
import os.path
import threading

#takes the argument: python FOLDER_NAME #ofThreads
#Example: python /parent 8

threads = 8 #input is 8

...
...

for t in threads:
    print("hello")

--output:--
TypeError: 'int' object is not iterable

你到处使用相同的变量名,这让你(或我?)感到困惑。

您也这样做:

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

您正在覆盖cmd参数变量,这意味着jobs()不应该有参数变量。

对评论1的回复

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()函数?”

  

我是python的新手

嗯,您的代码执行此操作:

threads = 8 

#Other irrelevant stuff here

for t in threads:
    print("hello")

,这将产生错误:

  

TypeError:'int'对象不可迭代

你知道为什么吗?