92
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

我只找到了有关使用单独脚本打开子进程的文档。有谁知道如何传递函数对象,甚至是传递函数代码的简单方法?

4

3 回答 3

123

我认为您正在寻找更像多处理模块的东西:

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

subprocess 模块用于生成进程并使用它们的输入/输出做事——而不是用于运行函数。

这是multiprocessing您的代码的一个版本:

from multiprocessing import Process, Queue

# must be a global function    
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
于 2010-01-12T03:57:13.867 回答
20

您可以使用标准的 Unixfork系统调用,如os.fork(). fork()将创建一个新进程,运行相同的脚本。在新进程中返回0,而在旧进程中返回新进程的进程ID。

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

对于更高级别的库,它提供多处理支持,为使用多个进程提供可移植的抽象,那就是多处理模块。IBM DeveloperWorks 上有一篇文章Multiprocessing with Python,简要介绍了这两种技术。

于 2010-01-12T03:58:47.570 回答
8

Brian McKenna 上面关于多处理的帖子确实很有帮助,但如果你想走线程路线(与基于进程相反),这个例子会让你开始:

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" 

您还可以使用该setDaemon(True)功能立即将线程置于后台。

于 2014-08-06T22:02:24.883 回答