2010-01-12 14 views
41
import subprocess 

def my_function(x): 
    return x + 100 

output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments 
print output 
#desired output: 101 

별도의 스크립트를 사용하여 하위 프로세스를 여는 데 필요한 설명서 만 있습니다. 누구든지 함수 객체를 전달하는 방법이나 함수 코드를 전달하는 쉬운 방법을 알고 있습니까?스레딩이나 별도의 파일/스크립트 작성없이 하위 프로세스에서 함수를 실행할 수 있습니까?

+1

나는 [다중 처리] (http://docs.python.org/3.1/library/multiprocessing.html) 모듈을 찾고 있다고 생각합니다. –

답변

65

난 당신이 더 많은 멀티 모듈처럼 뭔가를 찾고 있다고 생각 :

http://docs.python.org/library/multiprocessing.html#the-process-class

서브 프로세스 모듈이 산란 프로세스이며, 자신의 입/출력으로 일을 -하지 기능을 실행하기위한.

from multiprocessing import Process, Queue 

def my_function(q, x): 
    q.put(x + 100) 

if __name__ == '__main__': 
    queue = Queue() 
    p = Process(target=my_function, args=(queue, 1)) 
    p.start() 
    p.join() # this blocks until the process terminates 
    result = queue.get() 
    print result 
+13

'processify' 데코레이터를 단축키로 사용할 수 있습니다 : https://gist.github.com/2311116 – schlamar

+1

저는 이것이 파이썬 인터프리터와 서브 프로세스의 모든 환경을 복제한다고 가정합니다. – Jens

+0

여기 python 3에서 작동하고 generator 함수를 지원하는 processify 포크가 있습니다. https://gist.github.com/stuaxo/889db016e51264581b50 –

14

당신은 os.fork()로, 표준 유닉스 fork 시스템 호출을 사용할 수 있습니다 여기에

는 코드의 multiprocessing 버전입니다. fork() 같은 스크립트를 실행하면서 새 프로세스를 만듭니다. 새 프로세스에서는 0을 반환하고 이전 프로세스에서는 새 프로세스의 프로세스 ID를 반환합니다. 높은 레벨 라이브러리

child_pid = os.fork() 
if child_pid == 0: 
    print "New proc" 
else: 
    print "Old proc" 

는 즉 multiprocessing 모듈이있어, 여러 프로세스를 사용하는 휴대용 멀티 추상화를 제공 지원을 제공한다. 두 기술에 대한 간략한 소개와 함께 IBM DeveloperWorks의 기사, Multiprocessing with Python이 있습니다.

import threading 
import time 

def blocker(): 
    while True: 
     print "Oh, sorry, am I in the way?" 
     time.sleep(1) 

t = threading.Thread(name='child procs', target=blocker) 
t.start() 

# Prove that we passed through the blocking call 
print "No, that's okay" 

또한 사용할 수 있습니다 멀티에 대한

+0

나는 호기심있다. 왜 downvote? 내 대답에 문제가 있습니까? –

+0

다중 처리는 fork()를 둘러싼 상위 수준의 래퍼 일뿐만 아니라 멀티 플랫폼 다중 처리 툴킷 (유닉스에서는 fork를 사용함)입니다. 이것은 중요합니다. 왜냐하면 fork()는 그렇지 않지만 Windows에서는 실행된다는 것을 의미하기 때문입니다. 편집 : 그리고 이것은 downvote의 이유였습니다. 나중에 나중에 그럴만 한 가치가 없다고 결정했지만. 너무 늦었 어. Edit2 : 아니면 크로스 플랫폼이 아닌 경우 fork()가 제안되었습니다. –

+1

@Devin, 원한다면 항상 하향 투표를 취소 할 수 있습니다. –

3

브라이언 맥 케나의 위의 게시물이 예는 시작하는 것, 정말 도움이 될 것입니다,하지만 당신은 나사 경로를 아래로 가고 싶어하는 경우 (기반의 프로세스에 반대) setDaemon(True) 기능을 사용하면 즉시 스레드의 배경을 찾을 수 있습니다.