2012-07-12 2 views
2

파이썬에서 다중 처리 및 다중 스레드에 대한 정보를 찾았지만 기본 개념을 이해하지 못하고 내가 찾은 모든 예제가 내가하려는 것보다 더 어렵습니다.파이썬을 사용한 기본 다중 처리

필자는 X 독립 프로그램을 실행해야합니다. 첫 번째 Y 프로그램을 시작하고 싶습니다 (여기서 Y는 내 컴퓨터의 코어 수이고 X >> Y입니다). 독립적 인 프로그램 중 하나가 완료 되 자마자 다음 프로그램을 다음 사용 가능한 코어에서 실행하고 싶습니다. 나는 이것이 간단 할 것이라고 생각했지만, 계속 붙어있다. 이 문제를 해결하는 데 도움이 될만한 점이 많습니다.

편집 : 답변 해 주셔서 감사합니다. 또한 공유하고 싶은 joblib 모듈을 사용하는 다른 해결책을 발견했습니다. 입력 매개 변수 (a0, b0, c0)의 다른 조합으로 실행하고 모든 코어를 사용하려는 'program.py'라는 스크립트가 있다고 가정하십시오. 이것은 해결책입니다. 당신이 실행하기 전에

import os 
from joblib import Parallel, delayed 
a0 = arange(0.1,1.1,0.1) 
b0 = arange(-1.5,-0.4,0.1) 
c0 = arange(1.,5.,0.1) 
params = [] 
for i in range(len(a0)): 
    for j in range(len(b0)): 
     for k in range(len(c0)): 
      params.append((a0[i],b0[j],c0[k])) 

def func(parameters): 
    s = 'python program.py %g %g %g' % parameters[0],parameters[1],parameters[2]) 
    command = os.system(s) 
    return command 

output = Parallel(n_jobs=-1,verbose=1000)(delayed(func)(i) for i in params) 
+0

당신이 프로그램에서 무엇을 의미합니까를? 별도의 파이썬 스크립트? Python 라이브러리의 경우 스크립트가 함수로 사용 가능하면 편리합니다. –

+0

진정한 프로그램 인 경우 [gridengine] (http://gridengine.org/blog/)을 사용하여 모든 작업 관리를 처리 할 수 ​​있습니다. –

답변

0

안녕하세요, 그가 당신의 주요 개체 변수를 변경할 수 없습니다 , 내가 이해 무슨에서 PyQt는 에서 그는 단지 자신의 변수와 시저를 사용하여 실행중인 스레드 객체 QThread를 사용하여 이렇게 해요 당신이 예를 들어이 같은

해야합니다 쉬르 모든 qthread 변수를 정의하는 : 내가 기본 파이썬 스레드를 작동하지만 PyQt는 당신의 스레드가 신호를 시작하는 방법을 잘 알고 아니에요

class worker(QThread) 
def define(self, phase): 
    print 'define' 
    self.phase=phase 

    self.start()#will run your thread 
def continueJob(self): 
    self.start() 
def run(self): 
    self.launchProgramme(self.phase) 
    self.phase+=1 
def launchProgramme(self): 
    print self.phase 

를이 같은 기본 객체에는 다음 중지 thread.run 때 u는 스레드 변수의 값을 얻을 수있는 다음과 같은 연결

class mainObject(QtGui.QMainWindow) 
    def __init__(self): 
     super(mcMayaClient).__init__() 
     self.numberProgramme=4 
     self.thread = Worker() 
    #create 
     self.connect(self.thread , QtCore.SIGNAL("finished()"), self.threadStoped) 
     self.connect(self.thread , QtCore.SIGNAL("terminated()"), self.threadStopped) 

, 그것은 당신의 주된 목적에 threadStopped의 PROC를 시작합니다

def threadStopped(self): 
    value=self.worker.phase 
    if value<self.numberProgramme: 
     self.worker.continueJob() 

그런 다음에 다른 스레드 나 다른 스레드를 가져야 만합니다. 이것은 pyqt 스레딩을위한 것으로 물론 파이썬 기본 스레드에서 defStepped를 실행하는 방법이 다를 수 있습니다.

2

multiprocessing.Pool은 작업을 수행하는 "풀"(다른 번호를 지정할 수 있지만 코어 당 기본값 하나)을 나타냅니다. 그런 다음 작업을 풀에 제출하면 작업자가 풀을 사용할 수있을 때 처리합니다. 가장 쉬운 함수는 Pool.map입니다.이 함수는 전달 된 시퀀스의 각 인수에 대해 주어진 함수를 실행하고 각 인수에 대한 결과를 반환합니다. 반환 값이 필요하지 않은 경우 루프에서 apply_async을 사용할 수도 있습니다. 외부 프로그램뿐 아니라 파이썬 함수를 호출하려는 경우

def do_work(arg): 
    pass # do whatever you actually want to do 

def run_battery(args): 
    # args should be like [arg1, arg2, ...] 
    pool = multiprocessing.Pool() 
    ret_vals = pool.map(do_work, arg_tuples) 
    pool.close() 
    pool.join() 
    return ret_vals 

, subprocess를 사용합니다. 예를 들어,이, 전달 된 인수의 목록 cmd_name를 호출 리턴 코드가 0이 아닌 경우 예외를 발생, 출력 반환합니다

def do_work(subproc_args): 
    return subprocess.check_output(['cmd_name'] + list(subproc_args))