Python全局行为

时间:2013-03-31 09:22:00

标签: python global

在一个处理XML验证和放松的500k链接的脚本中,我试图计算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

1 个答案:

答案 0 :(得分:1)

run功能在第一个过程中运行,而对myFunc的调用则在不同的进程中完成,这些进程不共享地址空间。

你正在做什么会使用线程(可能使用一些锁...),因为他们共享地址空间。

如果要使用multiprocessing,则必须在进程之间使用一些显式进程通信。例如,您可以使用管道,队列或管理器(请参阅multiprocessing文档)。