1

私はPythonに非常に慣れていないため、簡単な質問をしている可能性があります。

私はPythonでマルチプロセスコードを書いています:

from multiprocessing import Process
from multiprocessing import Queue

class myClass(object):

    def __init__(self):
        self.__i = 0
        self.__name = 'rob'
        return

    def target_func(self, name, q):
        self.__name = name
        print 'Hello', self.__name
        self.__i += 1
        print self.__i
        q.put([self.__i, self.__name])
        return

    def name(self):
        return self.__name

    def i(self):
        return self.__i


if __name__ == '__main__':
    mc = myClass()

    q = Queue()

    p = Process(target = mc.target_func, args = ('bob', q,))
    p.start()
    ret = q.get()
    p.join()

    p2 = Process(target = mc.target_func, args = ('tom', q,))
    p2.start()
    ret = q.get()
    p2.join()

プリントアウトは

Hello bob
1
Hello tom
2

しかし、実際には、印刷物は

Hello bob
1
Hello tom
1    <------------------ Why it's not 2?

私が間違っていることを知ってもいいですか?

どうもありがとう。

4

3 に答える 3

2

target_func別のプロセスで呼び出されます。mc各サブプロセスにコピーされます。プロセス間で共有されません。

スレッドを使用すると、期待される(?)結果が得られます。安全のため、ロックを使用する必要があります。次のコードでは省略しました。

from threading import Thread
from Queue import Queue

....


if __name__ == '__main__':
    mc = myClass()

    q = Queue()

    p = Thread(target = mc.target_func, args = ('bob', q,))
    p.start()
    ret = q.get()
    p.join()

    p2 = Thread(target = mc.target_func, args = ('tom', q,))
    p2.start()
    ret = q.get()
    p2.join()
于 2013-08-14T08:17:50.863 に答える
0

スレッドとは異なり、プロセスはメモリを共有しません。2 番目のプロセスの名前 __i は、サブプロセスを起動したときに元のプロセスから初期値がコピーされた別の変数を参照します。

Value または Array データ型を使用して、あるプロセスから別のプロセスに情報を転送したり、Queue を使用してサブプロセスから元のプロセスにデータをプッシュしたりできます。これらのクラスはすべて multiprocessing モジュールに含まれています

http://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue http://docs.python.org/2/library/multiprocessing.html#multiprocessing.Value http://docs.python. org/2/library/multiprocessing.html#multiprocessing.Array

于 2013-08-14T08:16:35.360 に答える
0

作成する各プロセスは、以前に作成した mc クラス インスタンスのコピーを含む、親プロセスのメモリ空間の完全なコピーを取得するため、変数の値は同じです。したがって、各プロセス内から mc のインスタンス変数を変更しても、メイン プロセスの変数には影響しません。この動作のより簡潔な例を次に示します。

from multiprocessing import Process 

class A(object):

  def __init__(self):
      self.var = 1
      print "Initialized class: ",self

  def test(self):
      print self
      print "Variable value:",self.var
      self.var += 1

if __name__ == '__main__':

  a = A()

  p1 = Process(target = a.test)
  #Creates a copy of the curent memory space and will print "Variable value: 1"
  p1.start()

  p2 = Process(target = a.test)
  #Will still print "Variable value: 1"
  p2.start()
于 2013-08-14T08:20:41.907 に答える