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
我只找到有关使用单独的脚本打开子流程的文档。有谁知道如何传递函数对象甚至是传递函数代码的简便方法?
Answers:
我认为您正在寻找更类似于多处理模块的内容:
http://docs.python.org/library/multiprocessing.html#the-process-class
子流程模块用于生成流程并使用其输入/输出执行操作-不适用于运行功能。
这是multiprocessing
您的代码的版本:
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
processify
装饰器用作快捷方式:gist.github.com/2311116
您可以使用标准的Unixfork
系统调用os.fork()
。fork()
将创建一个运行相同脚本的新进程。在新进程中,它将返回0,而在旧进程中,它将返回新进程的进程ID。
child_pid = os.fork()
if child_pid == 0:
print "New proc"
else:
print "Old proc"
对于提供多处理支持并为使用多个进程提供可移植抽象的更高级别的库,提供了多处理模块。在IBM DeveloperWorks上有一篇关于Python的多处理的文章,其中简要介绍了这两种技术。
fork
是不可移植的。通常,我会给出不可移植的答案以及不可移植的信息,然后让提问者决定是否足够。当我编辑完答案后,如果您认为我已经对它进行了充分的改进,那么您应该可以删除它。即使您没有,也不会感到难过,但我只是想检查一下自己弄错了什么。
布赖恩·麦肯纳(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)
功能立即使线程后台。