2017-01-06 12 views
0

一連のコマンドを実行したいのですが時間がかかります。しかし、私は各コ​​マンドの完了を待つことを望んでいません。これについてPythonでどうすればいいですか?私はPythonはサブプロセスを作成して待機しません。

os.fork() 

subprocess.popen() 

はそれは私が必要なものではないと思います。

コード

def command1(): 
    wait(10) 

def command2(): 
    wait(10) 

def command3(): 
    wait(10) 

私は待つことなく

command1() 
command2() 
command3() 

を呼び出すしたいと思います。

+0

Python 3.4以降を使用している場合は、[asyncio subprocess](https://docs.python.org/3/library/asyncio-subprocess.html)を使用できます。 –

+0

コマンドがPython関数の場合は、スレッドを検討してください:https://docs.python.org/2/library/threading.htmlそれはまた、あなたが「私は待っていない」という意味のものに依存します。 – doomyster

+1

まあ...「待ち」を取り除いてください...ごめんなさい。 :)あなたは 'マルチプロセッシング'を調べましたか?すべてのコマンドに対してプロセスを開始できます。デフォルトのドキュメンテーションはこれをかなりうまく説明します。 –

答えて

2

最も簡単な方法は、Python自身のmultiprocessingを使用することです、このモジュールはもちろん、同じコードベースでアクセス可能な機能の外部プロセスの実行を制御する上で負担を軽減するために、正確に戻って導入された

from multiprocessing import Process 

def command1(): 
    wait(10) 
... 

call1 = Process(target=command1, args=(...)) 
call1.start() 
... 

ことサブプロセスであるos.forkを使用してすでに実行できます。マルチプロセッシングは、Python自身のthreading moudleインタフェースを可能な限りエミュレートします。スレッド処理でマルチプロセッシングを使用することのすぐれた利点の1つは、さまざまなワーカープロセスが異なるCPUコアを実際に並列に使用できるようにすることです。実際には、言語設計の限界により、したがって、いくつかが利用可能であっても、単一のコアを使用します。

ここでは、特にWebリクエスト内からこれらを呼び出すなどの特殊性があることに注意してください。この質問を数日前の回答フォームで確認してください: Stop a background process in flask without creating zombie processes

2

pythonのマルチプロセッシングモジュールを使用してください。

def func(arg1): 
    ... do something ... 

from multiprocessing import Process 
p = Process(target=func, args=(arg1,), name='func') 
p.start() 

完全Documentaionはこっちです:https://docs.python.org/2/library/multiprocessing.html

EDIT:あなたはJPythonの/ CPythonの配布を使用している場合は、GILを克服できるよう

あなたはまたのpythonのスレッドモジュールを使用することができます(グローバルインタプリタロック)を使用します。

https://docs.python.org/2/library/threading.html

+0

GILについての文章を修正/明確化する必要があります。 – moooeeeep

1

この例は多分あなたに適している:あなたはちょうどあなたの機能のためのデコレータ@forkedを使用

#!/usr/bin/env python3 

import sys 
import os 
import time 

def forked(fork_func): 
    def do_fork(): 
     pid = os.fork() 
     if (pid > 0): 
      fork_func() 
      exit(0) 
     else: 
      return pid 
    return do_fork 

@forked 
def command1(): 
    time.sleep(2) 

@forked 
def command2(): 
    time.sleep(1) 

command1() 
command2() 
print("Hello") 

問題は1つだけです。メインプログラムが終了すると、子プロセスの終了を待ちます。

+0

これは素晴らしい例ですが、実際にはPythonのマルチプロセッシングが何をするのかを再考するようになりました。ドキュメントを開くと、正しく動作させるための多くのことがわかります。 'os.fork'はWindowsプラットフォームでは動作しないという事実から始まります。 – jsbueno

+0

しかし、はい、そこにはとても素敵で簡単な例があります。とにかくありがとう。 – jsbueno

+0

私はマルチプロセッシングモジュールについて知っています。それが与えるのは、クロスプラットフォームだけです。作者は、コール時に最小限の構文で関数を起動することについて正確に尋ねました。この方法はそれを与える。 'do_fork()'の中に 'multiprocessing'機能を持つコードを書くことができます。それは良いことです。私は同意します。しかし私のアイデアは軽い構文のためにデコレータを使用しています、 'os.fork()'や 'multiprocess.Process()'ではありません。 – ValeriyKr

関連する問題