파이썬에서 다중 처리에서 "속성 오류: __exit_" 문제를 해결하는 방법은 무엇입니까?
Python 3.2.2에서 여러 코어에서 실행할 수 있도록 몇 가지 csv-reading 코드를 다시 작성하려고 했습니다.나는 그것을 사용하려고 했습니다.Pool
멀티프로세싱의 대상으로, 작업 예제에서 적용했으며 이미 프로젝트의 다른 부분에서 작업했습니다.해독 및 문제 해결이 어려운 오류 메시지를 발견했습니다.
오류:
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__
관련 코드:
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)
이 문제를 해결하는 좋은 방법은 무엇입니까?
문제는 다음 행에 있습니다.
with pattern.findall(row) as f:
다음을 사용 중입니다.with
진술.다음과 같은 개체가 필요합니다.__enter__
그리고.__exit__
방법들.그렇지만pattern.findall
를 반환합니다.list
,with
저장을 시도합니다.__exit__
메서드를 찾을 수 없고 오류가 발생합니다.그냥 사용하기
f = pattern.findall(row)
대신.
이 경우 질문자의 문제가 아니라 일반적인 "AttributeError:__exit_"에 대한 첫 번째 문제 해결 단계는 괄호가 있는지 확인하는 것입니다. 예를 들어,
with SomeContextManager() as foo:
#works because a new object is referenced...
것은 아니다.
with SomeContextManager as foo:
#AttributeError because the class is referenced
가끔 저를 밖으로 데리고 나가다가 결국 여기로 오게 됩니다.
이 오류는 또한 사용을 시도할 때 발생합니다.
with multiprocessing.Pool() as pool:
# ...
Python 2.X와 같이 너무 오래된 Python 버전을 사용하여 사용할 수 없습니다.with
멀티프로세싱 풀과 함께.
(자세한 내용은 이 답변 https://stackoverflow.com/a/25968716/1426569 을 참조하십시오.)
이 오류의 원인은 플라스크 앱이 이미 실행 중이고 종료되지 않았으며 그 중간에 app.app_context(): #Code로 다른 인스턴스를 시작하려고 합니다. 이를 문과 함께 사용하기 전에 이전 실행 중인 앱의 범위가 닫혔는지 확인해야 합니다.
언급URL : https://stackoverflow.com/questions/7447284/how-to-troubleshoot-an-attributeerror-exit-in-multiproccesing-in-python
'programing' 카테고리의 다른 글
Azure 웹 사이트 리소스 템플릿 오류 (0) | 2023.05.27 |
---|---|
명령이 0이 아닌 값을 반환하는 경우 셸 스크립트 중단 (0) | 2023.05.27 |
배열을 상수로 선언할 수 있습니까? (0) | 2023.05.27 |
iPhone 애플리케이션을 개발할 때 프로비저닝 프로필은 무엇에 사용됩니까? (0) | 2023.05.27 |
JavaScript가 배열에 있습니다. (0) | 2023.05.27 |