Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω ενα σκριπτακι σε python και θελω κατι το οποιο δεν γνωριζω πως να το κανω.

 

Θελω να μπορεσω να καταλαβω ποτε ολα τα processes εχουν τελειωσει μετα απο ενα loop για να μπορεσω στο τελος να κλεισω ενα αρχειο που ανοιξα.

 

Ιδου και το σκριπτ:


def parse(_dir,_file_):
     f.write('"{0}","{1}"\n'.format(unicode_dir,lines));

if __name__ == '__main__':
f = open('new-extract','w')
        for dirname in os.walk('data').next()[1]:
                p = Process(target=parse, args=(str(dirname.strip()),))
                p.start()

 

 Αρα με λιγα λογια, για καθε folder ανοιγω και ενα καινουργια process το οποιο θα κανει κατι(δεν ειναι επι του παροντος το τι θα κανει) και θα γραψει στο αρχειο new-extract αλλα δεν θα καταλαβω ποτε τελειωσαν ολα τα processes για να δώσω:

f.close() 

Καμια βοηθεια? Μπορεί να γινει ετσι ή θα πρεπει να παω σε κατι αλλο?

 

Ευχαριστω!

 

Δημοσ.

Μπορείς να κρατήσεις όλα τα processes σε έναν πίνακα και να τα ελέγχεις με την μέθοδο is_alive() της Process:

while True:
    if all([not p.is_alive() for p in processes]): 
         f.close()
         break
    else:
         time.sleep(0.5)

(Δεν είμαι σίγουρος ότι δουλεύει γιατί το έγραψα στο χέρι)
 

Γιατί δεν χρησιμοποιείς την with...open για το άνοιγμα του αρχείου;

 

Δημοσ.

Ηλια ευχαριστω για την λυση σου, θα το κοιταξω για τον πινακα.  Με with ...open κλεινει αυτοματα ε? Να σου πω δεν το σκεφτηκα αν και τοσο απλο.

Δημοσ.

Νομίζω ότι αυτό που θες είναι να χρησιμοποιήσεις ένα Pool και μετά να καλέσεις τη μέθοδο .join()

import threading, multiprocessing
from multiprocessing import Pool as ProcessPool
from multiprocessing.dummy import Pool as ThreadPool

def hello(n):
    t = threading.current_thread()
    p = multiprocessing.current_process()
    print(n, t.name, p.name)

thread_pool = ThreadPool(4)
thread_pool.map(hello, range(10))
thread_pool.close()
thread_pool.join()

process_pool = ProcessPool(4)
process_pool.map(hello, range(10))
process_pool.close()
process_pool.join()

Αν είσαι σε python 3.2+ ή δεν σε νοιάζει να εγκαταστήσεις κάτι από το pypi, μπορείς να το κάνεις και με το concurrent.futures που έχει λίγο καλύτερο API. Πχ

import threading
import multiprocessing
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def hello(n):
    t = threading.current_thread()
    p = multiprocessing.current_process()
    print(n, t.name, p.name)

with ThreadPoolExecutor(4) as executor:
    executor.map(hello, range(10))

with ProcessPoolExecutor() as executor:
    executor.map(hello, range(10))
Δημοσ.

Με with ...open κλεινει αυτοματα ε?

Ναι, ακόμα και αν προκύψει  κάποιο exception στον κώδικα σου.

 

Αλλιώς πρέπει να χρησιμοποιήσεις και το finally statement.

Δημοσ.

Ναι, ακόμα και αν προκύψει  κάποιο exception στον κώδικα σου.

 

Αλλιώς πρέπει να χρησιμοποιήσεις και το finally statement.

Απλα για να το κανουμε σαφες, αν προκυψει καποιο exception στο block του with θα το κανει handle ωστε να κλείσει κανονικά το αρχειο. Στη συνέχεια όμως θα κάνει reraise το exception.

 

Δεν κάνει δηλαδή handle οποιοδήποτε exception. Μόνο αυτά που αφορούν το Ι/Ο του αρχείου

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...