পাইথনের মাল্টিপ্রোসেসিংয়ে কীভাবে একটি "অ্যাট্রিবিউটআরার: __exit__" সমস্যা সমাধান করবেন?


87

পাইথন ৩.২.২ এ একাধিক কোর এ চালানোর জন্য আমি কিছু সিএসভি-পঠন কোডটি পুনরায় লেখার চেষ্টা করেছি। আমি 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)

এটির সমস্যা সমাধানের ভাল উপায় কী?


4
আমার ক্ষেত্রে, Noneস্কোপিংয়ের কারণে আমি দুর্ঘটনাক্রমে একটি পাস করছিলাম ।
থারস্মমনার

আমি যখন ক্লাস ঘোষণার সময় আমার কাছে ছিলাম Class SomeClass(object):যদিও আমার ক্লাসে স্পষ্টতই আমার প্রস্থান ছিল। একবার আমি উত্তরাধিকার objectএটি থেকে কাজ সরিয়েছি । কেন আমার কোনও ধারণা নেই, তাই
ওয়াইএমএমভি

উত্তর:


155

সমস্যাটি এই লাইনে রয়েছে:

with pattern.findall(row) as f:

আপনি withবিবৃতি ব্যবহার করছেন । এটির জন্য একটি পদ্ধতি __enter__এবং __exit__পদ্ধতি প্রয়োজন। কিন্তু pattern.findallএকটি প্রদান করে list, পদ্ধতিটি withসঞ্চয় করার চেষ্টা করে __exit__তবে এটি এটি খুঁজে পায় না এবং একটি ত্রুটি উত্থাপন করে। শুধু ব্যবহার

f = pattern.findall(row)

পরিবর্তে.


63

এটি এই পরিস্থিতিতে জিজ্ঞাসকের সমস্যা নয় তবে জেনেরিকের জন্য প্রথম সমস্যা সমাধানের পদক্ষেপ "অ্যাট্রিবিউটআরার: __exit__" অবশ্যই বন্ধনী রয়েছে কিনা তা নিশ্চিত করা উচিত, যেমন

with SomeContextManager() as foo:
    #works because a new object is referenced...

না

with SomeContextManager as foo:
    #AttributeError because the class is referenced

আমাকে সময়ে সময়ে ধরা দেয় এবং আমি এখানেই শেষ করি ___


9

ত্রুটিটি ব্যবহার করার চেষ্টা করার সময়ও ঘটে

with multiprocessing.Pool() as pool:
   # ...

পাইথন সংস্করণ যা খুব পুরাতন (পাইথন ২ এক্স এর মতো) সহ এবং withমাল্টিপ্রসেসিং পুলগুলির সাথে একত্রে ব্যবহার সমর্থন করে না ।

( আরও তথ্যের জন্য এই উত্তরটি https://stackoverflow.com/a/25968716/1426569 দেখুন)


হ্যাঁ! পাইথন ৩. এক্স-এ দুর্দান্ত কাজ করা হচ্ছে
শেনয়

-1

এই ত্রুটির পিছনে কারণ হ'ল: ফ্লাস্ক অ্যাপটি ইতিমধ্যে চলছে, শাট ডাউন হয়নি এবং এর মাঝামাঝি আমরা আরও একটি উদাহরণ শুরু করার চেষ্টা করব: app.app_context () সহ: # কোড বিবরণ দিয়ে এটি ব্যবহার করার আগে আমাদের তৈরি করা দরকার পূর্ববর্তী চলমান অ্যাপ্লিকেশনটির সুযোগটি বন্ধ রয়েছে তা নিশ্চিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.