0

XML検証とrelaxngで500kのリンクを処理するスクリプトで、myFunc()でケースをカウントしようとしました。グローバル変数を使用する場合、変更する前に myFunc() でそれらをグローバルにマークする必要がありました。myFunc() でそれらの値を出力すると、値が 1,2,3,4 などに変更されていることがわかります。しかし、run() の値を出力すると、変更された値が得られません。myFunc() で変更する前と同様に、run() では 3 つの変数はすべて 0 です。

私は、この仕事を行うためのより良い方法があることを知っています。しかし、私の質問は、変更されたグローバルが run() で変更されなくなった理由と、これを実現する可能性があるかどうかです。

マルチプロセッシングと関係がありますか?

valid = 0
excpt = 0
relaxerr = 0

def myFunc(link):
   try:
      global valid
      valid += 1
      print valid
      doc = etree.parse(urllib2.urlopen(link))
   except Exception, e:
      global except
      excpt += 1
      print excpt
      with open('log.txt', 'a') as f:
         f.write('%s\n' % e)
      return

   if not RELAXNG.validate(doc):
      global relaxerr
      relaxerr += 1
      print relaxerr
      with open('log.txt', 'a') as f:
         f.write('%s\n' % RELAXNG.error_log)
      return

   ....
   do stuff for valid ....

def run():
   ...
   pool.map_async(myFunc, links, 64)
   pool.wait()


   print valid
   print excpt
   print relaxerr
4

1 に答える 1

1

run関数は最初のプロセスで実行されますが、呼び出しはアドレス空間を共有しない別のmyFuncプロセスで行われます。

あなたがしていることは、アドレス空間を共有するため、スレッドで機能します(おそらくいくつかのロックを使用しています...)。

使用したい場合multiprocessingは、プロセス間の明示的なプロセス通信を使用する必要があります。たとえば、パイプ、キュー、またはマネージャーを使用できます (multiprocessingドキュメントを参照)。

于 2013-03-31T09:55:50.123 に答える