python进程返回全局变量

时间:2014-02-18 13:28:55

标签: python python-2.7 multiprocessing

我用python打开更多进程来通过urlib2来检索文件,我只是把这个调用放到了fucntion。

t = Process(target=traer, args=(dir, listado[contador],))

这是调用过程对象

的函数
def traer(dir,y):
    global listado2
    try:
        file = urllib2.urlopen(dir+y)
        nombre=y
        output = open('C:/ndfd/degrib/bin/archivos/'+nombre ,'wb')
        output.write(file.read())
        output.close()
    except urllib2.HTTPError, e:
        print 'HTTPError = ' + str(e.code)
    except urllib2.URLError, e:
        listado2.append(y)
        print 'URLError = ' + str(e.reason)

这是存档的根目录

 if __name__ == '__main__':
     global listado
     global listado2
     listado=[]
     listado2=[]
     crear_trip(dir,listado)
     salida_bath(dir,listado,listado2)
salida_bath 内的位于循环内,而则会打开该进程。

在异常中,我想附加一个名为listado2的全局变量,但是这不起作用,比如说它是未定义的listado2。

我对这个问题的修正,改变策略

在salida_bath中创建

    manager = Manager()
    listado2 = manager.dict()

将流程的概念和新的listado2放到流程中

    t = Process(target=traer, args=(contador,dir, listado[contador],listado2))

并在traer函数中更改此内容。

    except urllib2.URLError, e:
        listado2[contador]=y
        print 'URLError = ' + str(e.reason)

在外面检查这是否有效

 for x in listado2.values():
      listado.append(x)
 print listado

1 个答案:

答案 0 :(得分:3)

global statement仅通知解析器该变量不被视为本地变量,但如果不存在,则不定义新变量。在访问之前,您仍有责任将其初始化。您似乎认为它是一个列表(listado2.append(y)),但在您的代码中没有任何地方您实际使用列表值初始化它。 Python如何知道在从未分配过任何内容的变量上调用哪个.append()方法?