我正在尋找一個通過子進程自動化的linux腳本。子進程的每次迭代都應該在父目錄的每個子目錄中運行linux腳本,並且每個子進程都應該在單獨的線程中運行。使用線程並行運行子進程
我的目錄組織方式如下:
- /父母/ P1
- /parent/p2....and以此類推,直到
- /父母/ 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)
我對python比較陌生,所以請耐心等待我。我基本上試圖定義一個函數,它將成爲我所有subprocess.call作業的列表(?),並且使用線程函數,我可以調用前一個函數的每個作業並在一個線程上運行它。目前,作業被串聯在每個線程上,而不是並行。(即相同的作業在每個線程上運行)。所以我無法弄清楚如何在線程函數中指定我的參數。我確實嘗試調用一個沒有參數的函數,但是在線程的'target ='部分中定義它時會拋出一個錯誤。 – Anuiyer
@Anuiyer:_因此我無法弄清楚如何在線程函數中指定我的參數._請參閱我的帖子的底部。 – 7stud