2016-11-08 88 views
1

以下のコードを使用して、マルチプロセッシングのプロセス関数を使用して2つの関数を同時に実行するのは難しいです。最後に私の努力は、スクリプトの本体から照合されるタイマーを実行することです。時間が完了している場合は、本体の依存関係よりも独自のアクションがトリガーされます。時間が完了していなければ、次のアクションに移ります。Python 3複数の関数を同時に実行する

私はビルドとMacBook Proの上でこれを実行している: プロセッサ名:インテルCore 2 Duoプロセッサ プロセッサ速度:コアの1 総数:2

スクリプト2.66 GHzのプロセッサの 数:

#!/usr/bin/pyton 

# MODULES 
import time 
from multiprocessing import Process 

# GLOBAL VARIABLES 
Completion = '' 

# FUNCTIONS 
def Timer(duration): 
     global Completion 
     Ticker = 0 
     while Ticker != duration: 
       Ticker = Ticker + 1 
       print(Ticker) 
       time.sleep(1) 

     Completion = '{0}TickerDone'.format(duration) 

def Wait(seconds): 
     time.sleep(seconds) 

#MAIN 
P1 = Process(target = Timer(10)) 
P1.start() 

P2 = Process(target = Wait(11)) 
P2.start() 

P1.join() 
P2.join() 

print(Completion) 

if Completion == '10TickerDone': 
     print('Good to go!\n') 
else: 
     print('Not yet!\n') 

# END 

二つの機能が除外されて何をすべきか、しかし、最初の関数の完了を10 + 1 secondardsを待つように意図された第二の機能は、のみ、最初の関数たら10秒タイマーを開始し、あります完了しました。要するに、私は10秒タイマーをテストするために21秒待たなければなりません。

結果:最初の関数は、第三の機能を実行する前に終了した場合には、第2の機能をテストすることができますので、私がする必要がどのような

$ python Test.py 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
10TickerDone 
Good to go! 

は、並行して、これらの二つの機能を実行しています。

どこが間違っていますか?

+0

ノートのドキュメントは、私はスレッドでプロセスを置き換える、スレッドと同じことをしようとしますが、同じ結果を持っています。 – danjmwalker

+0

こんにちはマーク、私はあなたがそれを書いてみましたが、私は同じ結果を得ています。 – danjmwalker

+0

'P1 = Process(target = Timer(10)、args =(10、)) P1.start() P2 =プロセス(ターゲット=待機、args =(11)) P2.start – danjmwalker

答えて

1

あなたの主な問題サブプロセスでターゲットファンクションを実行していないという主な問題があります。別のプロセスを開始する前に直接実行しています。そして関数を呼び出し、ウィッヒは10秒間待機します、そして、ターゲットが実際にあるサブプロセスオブジェクトを作成する - Pythonがimediattely target=部分の左側に式を解決します P1 = Process(target = Timer(10)):ようにあなたのコードです

その関数の戻り値(None)。

だから、あなただけ行う場合:

#MAIN 

P1 = Process(target=Timer, args=(10,)) 
P1.start() 

P2 = Process(target=Wait, args=(11,)) 
P2.start() 

あなたは所望の方向に行く事を確認するために開始します。 違いを見てみましょう:ここでは、名前の直後に "カッコを入れてください"ということなく、関数名(大文字小文字、btw)を使用します。 Pythonの変数または関数名に続く括弧は、同期オブジェクト呼び出し(この場合は関数呼び出し)を示します。カッコなしで同じ名前を使用すると、作成しているProcessオブジェクトのパラメータとして関数が渡されます。引数はargsパラメータで区切られて渡されます。

しかし、それ以外にも、マルチプロセッシングはグローバル変数で全く機能しません。つまり、名前のとおり、各関数は異なるプロセスで実行され、独自のグローバル変数を持ちます。

代わりに、少し洗練された処理を行い、サブプロセスの各エントリポイントのパラメータとして渡された(マルチプロセッシング)キューを使用して、並列コードのアクションを調整する必要があります。

チェックhttps://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

+0

ありがとう、jsbueno。私の最後のコメントは、最初の関数の後に()を含めたところ、私の悪かったです。リンクありがとう。あなたが正しいと確信しています。私はその文書を読むのに少し時間がかかるでしょう。 – danjmwalker

関連する問題