在一个处理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
答案 0 :(得分:1)
run
功能在第一个过程中运行,而对myFunc
的调用则在不同的进程中完成,这些进程不共享地址空间。
你正在做什么会使用线程(可能使用一些锁...),因为他们做共享地址空间。
如果要使用multiprocessing
,则必须在进程之间使用一些显式进程通信。例如,您可以使用管道,队列或管理器(请参阅multiprocessing
文档)。