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