Tentei reescrever alguns códigos de leitura csv para poder executá-los em vários núcleos no Python 3.2.2. Tentei usar o Pool
objeto de multiprocessamento, que adaptei de exemplos de trabalho (e já trabalhei para mim em outra parte do meu projeto). Encontrei uma mensagem de erro que achei difícil de decifrar e solucionar.
O erro:
Traceback (most recent call last):
File "parser5_nodots_parallel.py", line 256, in <module>
MG,ppl = csv2graph(r)
File "parser5_nodots_parallel.py", line 245, in csv2graph
node_chunks)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 552, in get
raise self._value
AttributeError: __exit__
O código relevante:
import csv
import time
import datetime
import re
from operator import itemgetter
from multiprocessing import Pool
import itertools
def chunks(l,n):
"""Divide a list of nodes `l` in `n` chunks"""
l_c = iter(l)
while 1:
x = tuple(itertools.islice(l_c,n))
if not x:
return
yield x
def csv2nodes(r):
strptime = time.strptime
mktime = time.mktime
l = []
ppl = set()
pattern = re.compile(r"""[A-Za-z0-9"/]+?(?=[,\n])""")
for row in r:
with pattern.findall(row) as f:
cell = int(f[3])
id = int(f[2])
st = mktime(strptime(f[0],'%d/%m/%Y'))
ed = mktime(strptime(f[1],'%d/%m/%Y'))
# collect list
l.append([(id,cell,{1:st,2: ed})])
# collect separate sets
ppl.add(id)
return (l,ppl)
def csv2graph(source):
MG=nx.MultiGraph()
# Remember that I use integers for edge attributes, to save space! Dic above.
# start: 1
# end: 2
p = Pool()
node_divisor = len(p._pool)
node_chunks = list(chunks(source,int(len(source)/int(node_divisor))))
num_chunks = len(node_chunks)
pedgelists = p.map(csv2nodes,
node_chunks)
ll = []
ppl = set()
for l in pedgelists:
ll.append(l[0])
ppl.update(l[1])
MG.add_edges_from(ll)
return (MG,ppl)
with open('/Users/laszlosandor/Dropbox/peers_prisons/python/codetenus_test.txt','r') as source:
r = source.readlines()
MG,ppl = csv2graph(r)
Qual é uma boa maneira de solucionar isso?
python
python-3.x
multiprocessing
pool
László
fonte
fonte
None
devido a problemas de escopo.Class SomeClass(object):
embora eu tivesse explicitamente uma saída na minha classe. Depois de remover a herançaobject
funcionou. Eu não tenho ideia do porquê, então YMMVRespostas:
O problema está nesta linha:
Você está usando a
with
declaração. Requer um objeto com métodos__enter__
e__exit__
. Maspattern.findall
retorna alist
,with
tenta armazenar o__exit__
método, mas não consegue encontrá-lo e gera um erro. Apenas useem vez de.
fonte
Não é o problema do solicitante nesta instância, mas a primeira etapa de solução de problemas para um "AttributeError: __exit__" genérico deve certificar-se de que os colchetes estão lá, por exemplo
não
Pega-me de vez em quando e acabo aqui -__-
fonte
O erro também acontece ao tentar usar o
com uma versão Python muito antiga (como Python 2.X) e não compatível com o uso em
with
conjunto com pools de multiprocessamento.(Veja esta resposta https://stackoverflow.com/a/25968716/1426569 para outra pergunta para mais detalhes)
fonte
A razão por trás desse erro é: o aplicativo Flask já está em execução, não foi encerrado e, no meio disso, tentamos iniciar outra instância por: with app.app_context (): #Code Antes de usarmos essa instrução, precisamos fazer certifique-se de que o escopo do aplicativo em execução anterior esteja fechado.
fonte