RuntimeError: εκτός εργασίας από το πλαίσιο εφαρμογής. με app.app_context () δεν επίλυση του θέματος

ψήφοι
0

Προσπαθώ να εκτελέσετε μια χρονοβόρα βρόχο, έχοντας μια πισίνα των μεθόδων εργασίας για το χρησιμοποιείτε pool.map. Ο βρόχος είναι ένα μέρος μιας συνάρτησης άποψη που έχω τοποθετούνται σε ένα νέο συνάρτηση ώστε να μπορώ να περάσει να pool.map. Αλλά αυτό ρίχνει το σφάλμα -

RuntimeError: εκτός εργασίας από το πλαίσιο εφαρμογής.

Αυτό συνήθως σημαίνει ότι θα προσπαθήσει να χρησιμοποιήσει τη λειτουργικότητα που απαιτείται για τη διασύνδεση με το τρέχον αντικείμενο αίτηση με κάποιο τρόπο. Για να λυθεί αυτό, που έχει συσταθεί ένα πλαίσιο εφαρμογής με app.app_context (). Ανατρέξτε στην τεκμηρίωση για περισσότερες πληροφορίες.

Έκανα πραγματοποιήσετε την κλήση μεθόδου σε ένα with app.app_context()(όπως αναφέρεται εδώ ). Όμως, το σφάλμα δεν πάει μακριά. Παρακαλώ να μου πείτε πώς μπορώ να επιλύσετε αυτό το ζήτημα.

@app.route('/some_url', methods= ['POST'])
def view_function ():
    start_time = time.time()
    data = request.get_json()
    a = round(data.get('a', '') * data.get('a', ''))
    b = round(data.get('b', '') * data.get('b', ''))
    c = round(data.get('c', '') * data.get('c', ''))
    d = round(data.get('d', '') * data.get('d', ''))

    a_id = select.get_id(data.get('property', ''), session['somedata'][1])
    some_list, a_ids, loc = AnotherClassInDifferentDir.get_list(a_id, session['somedata'][1])
    value = select.get_value(//some arguments)

Αυτό είναι όπου Χρησιμοποιώ πολυεπεξεργασία, και όπου Ι χρησιμοποιώντας with app.app_context():(Αυτό είναι ένα μέρος της ίδιας λειτουργίας, view_function) -

    with app.app_context():
        e = data.get('e', '')
        stuff = session['somedata'][1]
        pool = Pool(processes = 2)
        func = partial(loopTask,e, a_id, a_ids, a, b, c, d, loc, stuff)
        stuff_array = [(index, item) for index, item in enumerate(some_list)]
        print(stuff_array =, stuff_array)
        pool.map(func, stuff_array)
        pool.close()
        pool.join()

    print(--- %s seconds --- % (time.time() - start_time))
    return ''

def loopTask(e, a_ids, a, b, c, d, loc, stuff, stuff_item):

    index, s = stuff_item
    c_id = document_ids[index]
    done = AnotherClassInDifferentDir.work(s)
    f = AnotherClassInDifferentDir.more_work(done, a, b, c, d, loc)
    if f != '':
        update.update_work(//some arguments)
        g.cnxn.commit()
        if (moreDB.check(//some arguments) ==0):
            update.work(//some arguments)
            g.cnxn.commit()
    else:
        pass

Πιστεύω ότι το g.cnxn.commit()προκαλεί αυτό το ζήτημα, δεδομένου ότι εκτίθεται από το πλαίσιο εφαρμογής, αλλά δεν είμαι σίγουρος. Παρακαλώ βοηθήστε!

Δημοσιεύθηκε 14/02/2020 στις 00:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Όπως αναφέρεται στη φιάλη έγγραφα , το πλαίσιο της εφαρμογής δεν είναι διαθέσιμη έξω από ένα αίτημα το οποίο είναι αυτό που συμβαίνει όταν η loopTaskεκτελείται σε μια διαφορετική διαδικασία. Σκεφτείτε περνώντας παράδειγμα εφαρμογής σας στην loopTaskλειτουργία και τυλίξτε τα τμήματα του κώδικα κάτω από αυτό που χρησιμοποιούν το gαντικείμενο χώρου ονομάτων στο εσωτερικό σας με μπλοκ. Δεν χρειάζεται πραγματικά το withμπλοκ στο εσωτερικό της σας view_functionαπό το ένα πλαίσιο app υπάρχει ήδη κατά τη διάρκεια του αιτήματος.

EDIT: Επειδή είμαστε για τη δημιουργία μιας σύνδεσης db πριν από κάθε αίτημα, ας έχεις με test_request_context. Μπορείτε να διαβάσετε περισσότερα γι 'αυτό εδώ . Είναι σήμαινε για τον έλεγχο, αλλά για τους σκοπούς μας, αυτό θα μας επιτρέψει να έχουμε μια σύνδεση db στο γεννήσει διαδικασία.

def loopTask(e, a_ids, a, b, c, d, loc, stuff, stuff_item, app):  # added app parameter 

    index, s = stuff_item
    c_id = document_ids[index]

    with app.test_request_context('/some_url'):
        app.preprocess_request()  # triggers 'connect_to_database'

        done = AnotherClassInDifferentDir.work(s)
        f = AnotherClassInDifferentDir.more_work(done, a, b, c, d, loc)
        if f != '':
            update.update_work(//some arguments)
            g.cnxn.commit()
            if (moreDB.check(//some arguments) ==0):
                update.work(//some arguments)
                g.cnxn.commit()
        else:
            pass

Αυτό τότε σημαίνει ότι οι withαλλαγές μπλοκ με:

    e = data.get('e', '')
    stuff = session['somedata'][1]
    pool = Pool(processes = 2)
    func = partial(loopTask,e, a_id, a_ids, a, b, c, d, loc, stuff, stuff_item)
    stuff_array = [(index, item) for index, item in enumerate(some_list)]
    print("stuff_array =", stuff_array)
    pool.map(func, (stuff_array, app))  # passing the `app` Flask instance here
    pool.close()
    pool.join()

Αυτό θα πρέπει να κάνει το κόλπο, αλλά στην ιδανική περίπτωση, θα πρέπει να έχουμε τη ρύθμιση της σύνδεσης db σε μια λειτουργία που μπορεί να χρησιμοποιηθούν και σε μας loopTask. Με αυτόν τον τρόπο, θα είχαμε δεν χρειάζεται η test_request_contextκαι να χρησιμοποιούν app_contextαντ 'αυτού.

Απαντήθηκε 14/02/2020 στις 00:41
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more