2009-04-22 18 views
2

にデータを送信する私はそうのようなProcessをサブクラス化している:Pythonのマルチプロセッシング:プロセス

class EdgeRenderer(Process): 
    def __init__(self,starter,*args,**kwargs): 
     Process.__init__(self,*args,**kwargs) 
     self.starter=starter 

そしてIはself.starterを使用run方法を定義します。

そのstarterオブジェクトは、私が定義したクラスStateです。

私はこれを行うのは大丈夫ですか?オブジェクトはどうなりますか?それはシリアル化されますか?これは、私が常にStateオブジェクトがシリアライズ可能であることを保証する必要があるということですか?新しいプロセスがこのオブジェクトの重複コピーを取得しますか?

答えて

8

UNIXシステムでは、マルチプロセッシングでos.fork()を使用してWindows上で子プロセスを作成し、サブプロセストリッキーとシリアル化を使用してデータを共有します。だから、クロスプラットフォームにするには、はい - それは直列化可能でなければなりません。子供は新しいコピーを得るでしょう。

from multiprocessing import Process 
import time 

class Starter(object): 
    def __init__(self): 
     self.state = False 

x = Starter() 

class EdgeRenderer(Process): 
    def __init__(self,starter,*args,**kwargs): 
     Process.__init__(self,*args,**kwargs) 
     self.starter=starter 
    def run(self): 
     self.starter.state = "HAM SANDWICH" 
     time.sleep(1) 
     print self.starter.state 

a = EdgeRenderer(x) 
a.start() 
x.state = True 
a.join() 
print x.state 

実行すると、あなたが表示されます。:言われて、ここでの例だと

HAM SANDWICH 
True 

親が(フォーク後に伝達されませんなりますので変更)と子供が行う変更には同じ問題があります。フォークの制限に従わなければなりません。

+0

あなたは私のヒーローです:-p – fuzzyman

+0

さて、わかりました。しかし、それは奇妙なことを残す:私は 'スターター'を通過するのと同じ方法でキューを通過すると、それは動作するので、それは重複しないと仮定します。だから、どのように普通のオブジェクトが重複しますが、キューはありませんか? –

+2

他のオブジェクトとは違って処理されるマルチプロセッシングキューについては、http://svn.python.org/view/python/trunk/Lib/multiprocessing/queues.pyを参照してください。ビュー=マークアップ – jnoller

関連する問題