web-dev-qa-db-ja.com

スレッドを作成したり、別のファイル/スクリプトを作成したりせずに、サブプロセスで関数を実行することは可能ですか?

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

個別のスクリプトを使用してサブプロセスを開くことに関するドキュメントのみを見つけました。関数オブジェクトを渡す方法や、関数コードを渡す簡単な方法さえ知っていますか?

55
wroscoe

マルチプロセッシングモジュールのようなものを探していると思います。

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
82
Brian McKenna

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とマルチプロセッシング に、両方の手法の簡単な紹介があります。

13
Brian Campbell

上記のマルチプロセッシングに関するブライアンマッケナの投稿は非常に役立ちますが、スレッド化されたルート(プロセスベースとは反対)に進みたい場合は、この例で開始できます。

_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)機能を使用して、スレッドをすぐにバックグラウンドにすることもできます。

5
user559633