2

私は次のようにサブクラス化しましProcessた:

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

run次に、を使用するメソッドを定義しますself.starter

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

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

4

1 に答える 1

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

そのため、親が行った変更は fork() の後に伝達されず、子が行った変更にも同じ問題があります。フォークの制限に従う必要があります。

于 2009-04-23T13:37:03.940 に答える