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
個別のスクリプトを使用してサブプロセスを開くことに関するドキュメントのみを見つけました。関数オブジェクトを渡す方法や、関数コードを渡す簡単な方法さえ知っていますか?
マルチプロセッシングモジュールのようなものを探していると思います。
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 __== '__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
os.fork()
のように、標準のUnix fork
システムコールを使用できます。 fork()
は、同じスクリプトを実行して新しいプロセスを作成します。新しいプロセスでは0を返し、古いプロセスでは新しいプロセスのプロセスIDを返します。
child_pid = os.fork()
if child_pid == 0:
print "New proc"
else:
print "Old proc"
複数のプロセスを使用するための移植可能な抽象化を提供するマルチプロセッシングサポートを提供する高レベルのライブラリには、 multiprocessing モジュールがあります。 IBM DeveloperWorksの記事 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"
_
setDaemon(True)
機能を使用して、スレッドをすぐにバックグラウンドにすることもできます。