0

在处理 500k XML 验证和relaxng 链接的脚本中,我尝试计算 myFunc() 中的案例。如果我使用全局变量,我必须在 myFunc() 中将它们标记为全局变量,然后才能更改它们。当我在 myFunc() 中打印出它们的值时,我可以看到值更改为 1、2、3、4 等等。但是当我打印出 run() 中的值时,我得到的不是更改的值。在 run() 中所有三个变量都为 0,就像在 myFunc() 中更改它们之前一样。

我知道有更好的方法来完成这项工作。但我的问题是为什么在 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 回答