Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: python and multiprocessing

python and multiprocessing 7 Χρόνια 3 Ημέρες πριν #4779

  • xristosss20
  • Το Άβαταρ του/της xristosss20
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 53
Γεια σας,

Έχω τρία function στην python που το κάθε ένα δεχετε σαν είσοδο μια εικόνα(δηλ το path της) και κάνει ένα απλό image processing και δημιουργεί σαν έξοδο μια νέα εικόνα(δηλ το path της).

στο παρακάτω παράδειγμα το ένα function εξαρτάται από το άλλο δηλ :
το function της alg2 παίρνει σαν είσοδο την εικόνα που δημιουργεί το function της alg και το function της alg3 δεχετε σαν είσοδο την εικόνα που δημιουργεί το function της alg2 το όποιο αυτό εξαρτάται από το function της alg1.

(ελπίζω να μην σας μπέρδεψα βασικά)

λόγο του σχετικά υψηλού χρόνου εκτέλεσης τους (image processing είναι αυτό) θα ήθελα να ρωτήσω αν μπορώ
να τα εκτελέσω παραληλλα μεταξύ τους χρησιμοποιωντας το multiprocessing της python.
διάβασα αρκετά για το multiprocessing το map και το pool αλλα μπερδεύτηκα αρκετά να σας πω την αλήθεια δεδομένου ότι πρώτη φορά ασχολουμε με παραληλο προγραμματισμο.

όποτε συνοψίζοντας έχω τρία αλληλοεξαρτομενα function και θα ήθελα να τα εκτελέσω μαζί αν γίνεται.
Επίσης θα ήθελα να μάθω πως θα εκτελούσα σύγχρονος αυτά τα τρία function αν δεν ήταν αλληλοεξαρτομενα μεταξύ τους δηλ το καθένα να ήταν αυτόνομο.

ευχαριστώ.
def alg1(input_path_image,output_path_image):
    start = timeit.default_timer()
    ###processing###)
    stop = timeit.default_timer()
    print stop - start
    return output_path_image
 
def alg1(output_path_image,output_path_image1):
    start = timeit.default_timer()
    ###processing###
    stop = timeit.default_timer()
    print stop - start
    return output_path_image1
 
def alg3(output_path_image1,output_path_image2):
    start = timeit.default_timer()
    ###processing###
    stop = timeit.default_timer()
    print stop - start
    return output_path_image2
 
if __name__ == '__main__':
   alg1(output_path_image,output_path_image)
   alg2(output_path_image1,output_path_image1)
   alg3(output_path_image2,output_path_image2)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4780

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Απο την στιγμή που η κάθε function εξαρτάτε από την έξοδο της άλλης πρέπει αναγκαστηκά να περιμένεις να τελειώση πρώτα η προιγούμενη από την οποία εξαρτάτε. Για αυτόν τον λόγο δεν μπορείς να τρέξεις και τις τρεις ταυτόχρονα.

-Πρέπει πρώτα να τελειώση η διαδικασία της πρώτης συνάρτησης για να παράγει την πρώτη έξοδο.
-Έτσι ώστε στην συνέχεια να την πάρει ως είσοδο η δεύτερη συνάρτηση και να παράγει την δικιά της έξοδο.

Και πάει λέγοντας...

Παράλληλο προγραμματισμό χρησιμοποιούμε όταν 2 ή περισσότερες διαδικασίες δεν εξαρτώνται μεταξύ τους ή αν εξαρτώνται, η εξαρτημένη διαδικασία να μην χρειάζεται άμεσα την έξοδο κάποιας άλλης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4781

  • xristosss20
  • Το Άβαταρ του/της xristosss20
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 53
μετά από πολύ αναζήτηση βρήκα ένα παράδειγμα :

def alg1(input_path_image,output_path_image, return_dict):
    start = timeit.default_timer()
    ###processing###)
    stop = timeit.default_timer()
    print stop - start
    return_dict['algo1'] = output_path_image
 
def alg2(output_path_image,output_path_image1, return_dict):
    start = timeit.default_timer()
    ###processing###
    stop = timeit.default_timer()
    print stop - start
    return_dict['algo2'] = output_path_image1
 
def alg3(output_path_image1,output_path_image2, return_dict):
    start = timeit.default_timer()
    ###processing###
    stop = timeit.default_timer()
    print stop - start
    return_dict['algo3'] = output_path_image2
 
if __name__ == '__main__':
    manager = Manager()
    return_dict = manager.dict()
    a1 = Process(target=alg1, args=(output_path_image,output_path_image, return_dict))
    a2 = Process(target=alg2, args=(output_path_image1,output_path_image1, return_dict))
    a3 = Process(target=alg3, args=(output_path_image2,output_path_image2, return_dict))
    jobs = [a1, a2, a3]
    for job in jobs:
        job.start()
    #for job in jobs:
        job.join()
    a1_return = return_dict['algo1']
    a2_return = return_dict['algo2']
    a3_return = return_dict['algo3']

άλλα δεν είναι πιο γρήγορο και το πιο κύριο είναι ότι δεν βγάζει σωστά αποτελέσματα.

δεν γίνετε επειδή μιλάμε για εικόνες ή είναι γενικό ?
Αν τα function δεν είχαν εξάρτηση μεταξύ τους πως θα μπορούσα να τα εκτελέσω ταυτόχρονα για να γλιτώσω χρόνο ?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4782

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Το multiprocessing ξέχνα το, δεν θα σε βοηθήσει σε αυτό το πρόβλημα.
Πρέπει να βρεις τρόπο για να βελτιώσεις τον κώδικα που τρέχει στην κάθε συνάρτηση έτσι ώστε να τρέχει ποιο γρήγορα. Τώρα αυτό εξαρτάτε από το τι κάνουν αυτές οι συναρτήσεις.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4783

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
xristosss20 έγραψε:
άλλα δεν είναι πιο γρήγορο και το πιο κύριο είναι ότι δεν βγάζει σωστά αποτελέσματα.

Σκέψου το ως εξής.
a1 = Process(target=alg1, args=(output_path_image,output_path_image, return_dict))
a2 = Process(target=alg2, args=(output_path_image1,output_path_image1, return_dict))
a3 = Process(target=alg3, args=(output_path_image2,output_path_image2, return_dict))

Εδώ δημιουργείς τρείς διεργασίες οι οποίες θα τρέχουν ταυτόχρονα. Εάν η a2 πάει να κάνει την δουλειά της χωρίς η a1 να έχει τελειώση, το output_path_image1 δεν θα έχει την σωστή τιμή. Το ίδιο και για την a3, αν δεν έχει τελειώση η a1 και η a2 δεν θα πάρει την σωστή τιμή από το output_path_image2. Αυτό ονομάζεται ασυγχρονησμός! Πρέπει αναγκαστηκά να περιμένεις να τελειώση πρώτα η a1, μετά η a2 και τέλος η a3 έτσι ώστε η κάθε μία να πάρει ως είσοδο την έξοδο της προηγούμενης, για αυτόν τον λόγο δεν μπορείς να τις τρέχεις παράλληλα.
Τελευταία διόρθωση: 7 Χρόνια 2 Ημέρες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4784

  • xristosss20
  • Το Άβαταρ του/της xristosss20
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 53
ωραία ψάχνω να βρω τρόπο άλλα δεν βρίσκω(και πιθανόν να μην βρω αν και νομίζω στην matlab γίνετε χωρίς να πάρω και όρκο) ας πάμε στην υπόθεση ότι η μια συνάρτηση δεν εξαρτάτε από την άλλη πως μπορώ να της εκτελέσω παράλληλα ?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4785

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
xristosss20 έγραψε:
ωραία ψάχνω να βρω τρόπο άλλα δεν βρίσκω(και πιθανόν να μην βρω αν και νομίζω στην matlab γίνετε χωρίς να πάρω και όρκο) ας πάμε στην υπόθεση ότι η μια συνάρτηση δεν εξαρτάτε από την άλλη πως μπορώ να της εκτελέσω παράλληλα ?

Multiprocessing είναι ένας τρόπος. Αυτόν που προτείνω όμως εγώ είναι το multithreading. Η διαφορά τους είναι ότι στο multithreading οι διεργασίες σου μοιράζονται την ίδια μνήμη και έτσι μπορούν να εποικηνωνούν πολύ εύκολα.

threading python
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4786

  • xristosss20
  • Το Άβαταρ του/της xristosss20
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 53
μάλιστα όμως έχουμε αποκλείσει την επικοινωνία στην περίπτωση μου άρα πάμε σαν αυτόνομες διαδικασίες,σωστά ?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4787

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
xristosss20 έγραψε:
μάλιστα όμως έχουμε αποκλείσει την επικοινωνία στην περίπτωση μου άρα πάμε σαν αυτόνομες διαδικασίες,σωστά ?

Ναι. Αν θες πόσταρε όλο τον κώδικα της κάθε συνάρτησης να δούμε αν βελτιώνεται. Δεν είμαι σίγουρος αν μπορέσω να σε βοηθήσω μιας και δεν γνωρίζω επεξεργασία εικόνας, αλλά μπορεί κάποιος άλλος να ξέρει.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4788

  • xristosss20
  • Το Άβαταρ του/της xristosss20
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 53
όχι σίγουρα δεν βελτιώνετε αλλά βρήκα τρόπο να της κάνω ανεξάρτητες τελικά μεταξύ τους(απλώς χάνω λίγο χώρο στον δίσκο μου μικρο το κακό) όποτε τώρα θα πρέπει να βρω τρόπο να της τρέξω ταυτόχρονα όπως μου πρότεινες με το threading.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

python and multiprocessing 7 Χρόνια 2 Ημέρες πριν #4789

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
xristosss20 έγραψε:
όχι σίγουρα δεν βελτιώνετε αλλά βρήκα τρόπο να της κάνω ανεξάρτητες τελικά μεταξύ τους(απλώς χάνω λίγο χώρο στον δίσκο μου μικρο το κακό) όποτε τώρα θα πρέπει να βρω τρόπο να της τρέξω ταυτόχρονα όπως μου πρότεινες με το threading.

Καλή τύχη.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 1 Ημέρα πριν #4790

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Κοίτα λίγο αυτό μήπως σε βοήθησει
stackabuse.com/parallel-processing-in-py...&utm_campaign=weekly

κοίτα και αυτό
docs.python.org/3/library/concurrent.futures.html

Γενικά μια σκέψη είναι να χρησιμοποιήσεις το multiprocessing για να κάνεις πιο γρήγορες
τις συναρτήσεις που χρησιμοποιείς
Εφόσον είναι αργές γιατί επεξεργάζονται πολλά data
βάλε τα data παράμετρο στη συνάρτηση και κάνε map ένα pool και μέτρα χρόνους
from multiprocessing import Pool
 
    with Pool(processes=4) as pool:
        result = pool.map(alg1, data)
 

έτσι η alg1 θα τρέχει χ4 χωρίς να σημαίνει ότι θα έχεις το αποτέλεσμα 4 φορές γρηγορότερα αλλά και κάποιο σημαντικό ποσοστό να δεις είναι όφελος
Τελευταία διόρθωση: 7 Χρόνια 1 Ημέρα πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": xristosss20

python and multiprocessing 7 Χρόνια 1 Ημέρα πριν #4791

  • xristosss20
  • Το Άβαταρ του/της xristosss20
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 53
θα το δοκιμάσω δεν έχω να χάσω τπτ,αλλά πως το εννοείς το χ4 ?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

python and multiprocessing 7 Χρόνια 20 Ώρες πριν #4792

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Το πρώτο παράδειγμα που έχει το multiprocessing
docs.python.org/3/library/multiprocessing.html

Το δοκιμάζω στον δικό μου υπολογιστή δοκιμάζοντας να πάρω τα τετράγωνα των 10.000.000 αριθμών
0-9999999

file1.py χωρίς multi
import time
def f(x):
    return x**2
 
if __name__=='__main__':
    data=range(10000000)
 
    start=time.time()
    result=list(map(f,data))
    t=time.time()-start
    print(t)

παίρνω στον υπολογιστή μου 4.296740770339966

file2.py με multi
from multiprocessing import Pool
import time
def f(x):
    return x**2
 
if __name__=='__main__':
    data=range(10000000)
    pool=Pool(processes=4)
    start=time.time()
    result=list(pool.map(f,data))
    t=time.time()-start
    print(t)
παίρνω 2.9711685180664062
και αν κάνω τα processes από 4 8
2.5611021518707275
είναι αρκετά καλά
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.426 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου