theodoros8 Δημοσ. 24 Δεκεμβρίου 2014 Δημοσ. 24 Δεκεμβρίου 2014 Εχω ενα σκριπτακι σε 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() Καμια βοηθεια? Μπορεί να γινει ετσι ή θα πρεπει να παω σε κατι αλλο? Ευχαριστω!
Ilias95 Δημοσ. 24 Δεκεμβρίου 2014 Δημοσ. 24 Δεκεμβρίου 2014 Μπορείς να κρατήσεις όλα τα 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 για το άνοιγμα του αρχείου;
theodoros8 Δημοσ. 24 Δεκεμβρίου 2014 Μέλος Δημοσ. 24 Δεκεμβρίου 2014 Ηλια ευχαριστω για την λυση σου, θα το κοιταξω για τον πινακα. Με with ...open κλεινει αυτοματα ε? Να σου πω δεν το σκεφτηκα αν και τοσο απλο.
pmav99 Δημοσ. 24 Δεκεμβρίου 2014 Δημοσ. 24 Δεκεμβρίου 2014 Νομίζω ότι αυτό που θες είναι να χρησιμοποιήσεις ένα 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))
Ilias95 Δημοσ. 24 Δεκεμβρίου 2014 Δημοσ. 24 Δεκεμβρίου 2014 Με with ...open κλεινει αυτοματα ε? Ναι, ακόμα και αν προκύψει κάποιο exception στον κώδικα σου. Αλλιώς πρέπει να χρησιμοποιήσεις και το finally statement.
theodoros8 Δημοσ. 24 Δεκεμβρίου 2014 Μέλος Δημοσ. 24 Δεκεμβρίου 2014 ωραια, ευχαριστω, θα τα μελετησω λιγακι και θα σας πω αν εχω προβλημα! ευχαριστω και παλι!
pmav99 Δημοσ. 25 Δεκεμβρίου 2014 Δημοσ. 25 Δεκεμβρίου 2014 Ναι, ακόμα και αν προκύψει κάποιο exception στον κώδικα σου. Αλλιώς πρέπει να χρησιμοποιήσεις και το finally statement. Απλα για να το κανουμε σαφες, αν προκυψει καποιο exception στο block του with θα το κανει handle ωστε να κλείσει κανονικά το αρχειο. Στη συνέχεια όμως θα κάνει reraise το exception. Δεν κάνει δηλαδή handle οποιοδήποτε exception. Μόνο αυτά που αφορούν το Ι/Ο του αρχείου
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα