2016-07-29 14 views
0

Pythonでは、プロセス間でオブジェクトを交換することは十分に文書化されています。キュー、パイプ、またはプールを使用する必要があります(doc参照)。では、なぜこれらのコミュニケーションツールがなくても、このスーパーシンプルなコードが動作するのですか?それが唯一のスレッド間で共有メモリに頼っているためこのプロセス間通信はなぜ機能していますか?

from multiprocessing import Process 
from time import sleep 
from random import random 

class Child_process(Process): 

    def __init__(self): 
    super(Child_process,self).__init__() 
    self._memory = {'a':1} 

    def writeInMemory(self,key,value): 
    self._memory[key]=value 

    def readFromMemory(self,key): 
    return self._memory[key] 

    def run(self): 
    while True: 
     sleep(random()) 

def main(): 
    # start up the child process: 
    child = Child_process() 
    child.daemon=True 
    child.start() 
    print 'Type Ctrl C to stop' 
    while True: 
    print "in sub process a = ", child.readFromMemory('a') 
    child.writeInMemory('b',random()) 
    print "in sub process b = ", child.readFromMemory('b') 
    sleep(5*random()) 
    # exiting 
    child.terminate() 
    child.join() 

if __name__ == '__main__': 
    main() 

結果は

Type Ctrl C to stop 
in sub process a = 1 
in sub process b = 0.469400505093 
in sub process a = 1 
in sub process b = 0.43154478374 
in sub process a = 1 
in sub process b = 0.519863589476 
+1

私が見ている限り、1つの子プロセスしか開始していません。 mainメソッドで実行されているwhileループで、 "In sub-process a/b"を印刷しています。プロセス間のコミュニケーションはありません。 – EngineeredBrain

+0

OK。今、私は分かる。どうもありがとう。 – user3650925

答えて

0

です。 しかし、ブロッキングメッセージを送信し、応答時間が短くCPU消費量が少ない場合は、パイプなどを共有する必要があります。

この例では、ランダムスリープコールを使用しているため、代表的なものではありません。

+0

私はあなたの答えジャン=フランソワを理解しているかどうかはわかりません。私は、ブロックするメッセージにキューやパイプが必要であることに同意します。私の質問はむしろ:私はメッセージをブロックする必要はない場合、私のコードを受け入れるか、それはPythonのルールに違反していますか? – user3650925

0

プロセス間通信が行われているためです。

は、子プロセスで _memoryの値を印刷するには、コードを変更します。

def run(self): 
    while True: 
     print('Memory is', self._memory) 
     sleep(random()) 

そして、あなたは、サブプロセス内のメモリは決して変化しないことがわかります。

サンプル出力は次のとおりです。

Type Ctrl C to stop 
in sub process a = 1 
in sub process b = 0.571476878791 
('memory', {'a': 1}) 
('memory', {'a': 1}) 
('memory', {'a': 1}) 
('memory', {'a': 1}) 
in sub process a = 1 
in sub process b = 0.0574249557159 
('memory', {'a': 1}) 
('memory', {'a': 1}) 

注それは常に印刷さか:

('memory', {'a':1}) 

代わりに、言う:

('memory', {'a': 1, 'b': 0.0574249557159}) 

だから何が起こっていることは、すべての通話ということですがローカルです。あなたは何もしないサブプロセスを産み出しており、あなたはそれとのコミュニケーションを何もしていません。 のサブプロセスはの属性_memoryにコピーされますが、その属性は変更されず、メインプロセスの変更は子プロセスに影響しません。


あなたは基本的にサブプロセスを無駄にしています。 で使用しないで生成し、それを生成した後は、childを他のPythonオブジェクトとまったく同じように扱っています。

+0

あなたは子供のself._memoryがchild._ memoryとは異なることを意味しますか? – user3650925

+0

@ user3650925はい。 'start()'を呼び出すと、現在のプロセスのメモリを基本的に**コピー**したサブプロセスを開始し、(サブプロセスの) 'run'メソッドのコードを実行します。サブプロセスをどのように処理するかによって、WindowsとLinux/OS Xの動作が異なることに注意してください。 – Bakuriu

+0

ありがとうございます:-) – user3650925

関連する問題