Πώς να βελτιώσετε τον κώδικα Python σας με ταυτόχρονη και παραλληλία

Βασικά Takeaways

  • Η συγχρονικότητα και ο παραλληλισμός είναι θεμελιώδεις αρχές της εκτέλεσης εργασιών στους υπολογιστές, με το καθένα να έχει τα ξεχωριστά χαρακτηριστικά του.
  • Η ταυτόχρονη χρήση επιτρέπει την αποτελεσματική χρήση των πόρων και τη βελτιωμένη απόκριση των εφαρμογών, ενώ ο παραλληλισμός είναι ζωτικής σημασίας για τη βέλτιστη απόδοση και επεκτασιμότητα.
  • Η Python παρέχει επιλογές για χειρισμό ταυτόχρονης λειτουργίας, όπως threading και ασύγχρονο προγραμματισμό με asyncio, καθώς και παραλληλισμό χρησιμοποιώντας τη μονάδα πολλαπλής επεξεργασίας.

Ο συγχρονισμός και ο παραλληλισμός είναι δύο τεχνικές που σας επιτρέπουν να εκτελέσετε πολλά προγράμματα ταυτόχρονα. Η Python έχει πολλές επιλογές για τον χειρισμό εργασιών ταυτόχρονα και παράλληλα, κάτι που μπορεί να προκαλέσει σύγχυση.

Εξερευνήστε τα εργαλεία και τις βιβλιοθήκες που είναι διαθέσιμα για τη σωστή εφαρμογή της ταυτότητος και του παραλληλισμού στην Python και πώς διαφέρουν.

Κατανόηση της Συγχρονικότητας και του Παραλληλισμού

Ο συγχρονισμός και ο παραλληλισμός αναφέρονται σε δύο θεμελιώδεις αρχές της εκτέλεσης εργασιών στους υπολογιστές. Το καθένα έχει τα δικά του χαρακτηριστικά.

  • Το Concurrency είναι η ικανότητα ενός προγράμματος να διαχειρίζεται πολλές εργασίες ταυτόχρονα χωρίς απαραίτητα να τις εκτελεί την ίδια ακριβώς στιγμή. Περιστρέφεται γύρω από την ιδέα της παρεμβολής εργασιών, εναλλαγής μεταξύ τους με τρόπο που φαίνεται ταυτόχρονα.
  • Ο παραλληλισμός, από την άλλη πλευρά, περιλαμβάνει την εκτέλεση πολλαπλών εργασιών πραγματικά παράλληλα. Συνήθως εκμεταλλεύεται πολλαπλούς πυρήνες ή επεξεργαστές CPU. Το Parallelism επιτυγχάνει πραγματική ταυτόχρονη εκτέλεση, επιτρέποντάς σας να εκτελείτε εργασίες γρηγορότερα και είναι κατάλληλος για υπολογιστικά εντατικές λειτουργίες.
  •   Πώς να αλλάξετε το συνδυασμό χρωμάτων του σχεδίου Canva σας με ένα κλικ

    Η σημασία της ταυτότητος και του παραλληλισμού

    Η ανάγκη για συγχρονισμό και παραλληλισμό στους υπολογιστές δεν μπορεί να υπερεκτιμηθεί. Να γιατί αυτές οι τεχνικές έχουν σημασία:

  • Χρήση πόρων: Η ταυτόχρονη χρήση επιτρέπει την αποτελεσματική χρήση των πόρων του συστήματος, διασφαλίζοντας ότι οι εργασίες σημειώνουν ενεργή πρόοδο αντί να περιμένουν αδιάφορα τους εξωτερικούς πόρους.
  • Απόκριση: Η ταυτόχρονη χρήση μπορεί να βελτιώσει την ανταπόκριση των εφαρμογών, ειδικά σε σενάρια που αφορούν διεπαφές χρήστη ή διακομιστές ιστού.
  • Απόδοση: Ο παραλληλισμός είναι ζωτικής σημασίας για την επίτευξη βέλτιστης απόδοσης, ιδιαίτερα σε εργασίες που συνδέονται με την CPU, όπως σύνθετοι υπολογισμοί, επεξεργασία δεδομένων και προσομοιώσεις.
  • Επεκτασιμότητα: Τόσο ο συγχρονισμός όσο και ο παραλληλισμός είναι απαραίτητες για την κατασκευή κλιμακούμενων συστημάτων.
  • Προστασία στο μέλλον: Καθώς οι τάσεις του υλικού συνεχίζουν να ευνοούν τους πολυπύρηνους επεξεργαστές, η δυνατότητα αξιοποίησης του παραλληλισμού θα γίνεται όλο και πιο απαραίτητη.
  • Συγχρονισμός σε Python

    Μπορείτε να επιτύχετε ταυτόχρονη χρήση στην Python χρησιμοποιώντας threading και ασύγχρονο προγραμματισμό με τη βιβλιοθήκη asyncio.

    Threading σε Python

    Το Threading είναι ένας μηχανισμός ταυτόχρονης Python που σας επιτρέπει να δημιουργείτε και να διαχειρίζεστε εργασίες σε μια ενιαία διαδικασία. Τα νήματα είναι κατάλληλα για ορισμένους τύπους εργασιών, ιδιαίτερα εκείνες που είναι συνδεδεμένες με I/O και μπορούν να επωφεληθούν από την ταυτόχρονη εκτέλεση.

    Η ενότητα threading της Python παρέχει μια διεπαφή υψηλού επιπέδου για τη δημιουργία και τη διαχείριση νημάτων. Ενώ το GIL (Global Interpreter Lock) περιορίζει τα νήματα από την άποψη του αληθινού παραλληλισμού, μπορούν ακόμα να επιτύχουν ταυτόχρονη παρεμβολή των εργασιών αποτελεσματικά.

    Ο παρακάτω κώδικας δείχνει ένα παράδειγμα υλοποίησης ταυτόχρονης χρήσης νημάτων. Χρησιμοποιεί τη βιβλιοθήκη αιτημάτων Python για να στείλει ένα αίτημα HTTP, μια κοινή εργασία αποκλεισμού I/O. Χρησιμοποιεί επίσης τη μονάδα χρόνου για τον υπολογισμό του χρόνου εκτέλεσης.

     import requests
    import time
    import threading

    urls = [
        'https://www.google.com',
        'https://www.wikipedia.org',
        'https://www.makeuseof.com',
    ]


    def download_url(url):
        response = requests.get(url)
        print(f"Downloaded {url} - Status Code: {response.status_code}")


    start_time = time.time()

    for url in urls:
        download_url(url)

    end_time = time.time()
    print(f"Sequential download took {end_time - start_time:.2f} seconds\n")


    start_time = time.time()
    threads = []

    for url in urls:
        thread = threading.Thread(target=download_url, args=(url,))
        thread.start()
        threads.append(thread)


    for thread in threads:
        thread.join()

    end_time = time.time()
    print(f"Threaded download took {end_time - start_time:.2f} seconds")

    Εκτελώντας αυτό το πρόγραμμα, θα πρέπει να δείτε πόσο πιο γρήγορες είναι οι αιτήσεις με νήματα από τις διαδοχικές αιτήσεις. Αν και η διαφορά είναι μόνο ένα κλάσμα του δευτερολέπτου, έχετε μια ξεκάθαρη αίσθηση της βελτίωσης της απόδοσης όταν χρησιμοποιείτε threads για εργασίες που συνδέονται με I/O.

      5 καλύτερα μέρη για να βρείτε ταλέντο στο Διαδίκτυο – Προσλάβετε Remote Talent

    Ασύγχρονος Προγραμματισμός με Asyncio

    asyncio παρέχει έναν βρόχο συμβάντων που διαχειρίζεται ασύγχρονες εργασίες που ονομάζονται κορουτίνες. Οι κορουτίνες είναι λειτουργίες τις οποίες μπορείτε να θέσετε σε παύση και να συνεχίσετε, καθιστώντας τις ιδανικές για εργασίες που συνδέονται με I/O. Η βιβλιοθήκη είναι ιδιαίτερα χρήσιμη για σενάρια όπου οι εργασίες περιλαμβάνουν αναμονή εξωτερικών πόρων, όπως αιτήματα δικτύου.

    Μπορείτε να τροποποιήσετε το προηγούμενο παράδειγμα αποστολής αιτήματος για να εργαστείτε με το asyncio:

     import asyncio
    import aiohttp
    import time

    urls = [
        'https://www.google.com',
        'https://www.wikipedia.org',
        'https://www.makeuseof.com',
    ]


    async def download_url(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                content = await response.text()
                print(f"Downloaded {url} - Status Code: {response.status}")


    async def main():
        
        tasks = [download_url(url) for url in urls]

        
        await asyncio.gather(*tasks)

    start_time = time.time()


    asyncio.run(main())

    end_time = time.time()

    print(f"Asyncio download took {end_time - start_time:.2f} seconds")

    Χρησιμοποιώντας τον κώδικα, μπορείτε να κάνετε λήψη ιστοσελίδων ταυτόχρονα χρησιμοποιώντας το asyncio και να επωφεληθείτε από τις ασύγχρονες λειτουργίες I/O. Αυτό μπορεί να είναι πιο αποτελεσματικό από το threading για εργασίες που συνδέονται με I/O.

      Εξασκήστε τις δεξιότητές σας SQL σε αυτές τις 6 πλατφόρμες κωδικοποίησης

    Παραλληλισμός στην Python

    Μπορείτε να εφαρμόσετε παραλληλισμό χρησιμοποιώντας Η ενότητα πολλαπλής επεξεργασίας της Pythonπου σας επιτρέπει να εκμεταλλευτείτε πλήρως τους πολυπύρηνους επεξεργαστές.

    Πολυεπεξεργασία σε Python

    Η λειτουργική μονάδα πολλαπλής επεξεργασίας της Python παρέχει έναν τρόπο επίτευξης παραλληλισμού δημιουργώντας ξεχωριστές διεργασίες, η καθεμία με τον δικό της διερμηνέα Python και χώρο μνήμης. Αυτό παρακάμπτει αποτελεσματικά το Παγκόσμιο Κλείδωμα Διερμηνέα (GIL), καθιστώντας το κατάλληλο για εργασίες που συνδέονται με την CPU.

     import requests
    import multiprocessing
    import time

    urls = [
        'https://www.google.com',
        'https://www.wikipedia.org',
        'https://www.makeuseof.com',
    ]


    def download_url(url):
        response = requests.get(url)
        print(f"Downloaded {url} - Status Code: {response.status_code}")

    def main():
        
        num_processes = len(urls)
        pool = multiprocessing.Pool(processes=num_processes)

        start_time = time.time()
        pool.map(download_url, urls)
        end_time = time.time()

        
        pool.close()
        pool.join()

        print(f"Multiprocessing download took {end_time-start_time:.2f} seconds")

    main()

    Σε αυτό το παράδειγμα, η πολυεπεξεργασία δημιουργεί πολλαπλές διεργασίες, επιτρέποντας στη συνάρτηση download_url να εκτελείται παράλληλα.

    Πότε να χρησιμοποιήσετε το Concurrency ή Parallelism

    Η επιλογή μεταξύ συγχρονισμού και παραλληλισμού εξαρτάται από τη φύση των εργασιών σας και τους διαθέσιμους πόρους υλικού.

    Μπορείτε να χρησιμοποιήσετε τη συγχρονικότητα όταν ασχολείστε με εργασίες που συνδέονται με I/O, όπως η ανάγνωση και η εγγραφή σε αρχεία ή η υποβολή αιτημάτων δικτύου και όταν ανησυχείτε για περιορισμούς μνήμης.

    Χρησιμοποιήστε την πολυεπεξεργασία όταν έχετε εργασίες συνδεδεμένες με CPU που μπορούν να επωφεληθούν από τον πραγματικό παραλληλισμό και όταν έχετε ισχυρή απομόνωση μεταξύ των εργασιών, όπου η αποτυχία μιας εργασίας δεν πρέπει να επηρεάζει άλλες.

    Εκμεταλλευτείτε τον Συγχρονισμό και τον Παραλληλισμό

    Ο παραλληλισμός και ο συγχρονισμός είναι αποτελεσματικοί τρόποι βελτίωσης της ανταπόκρισης και της απόδοσης του κώδικα Python σας. Είναι σημαντικό να κατανοήσετε τις διαφορές μεταξύ αυτών των εννοιών και να επιλέξετε την πιο αποτελεσματική στρατηγική.

    Η Python προσφέρει τα εργαλεία και τις ενότητες που χρειάζεστε για να κάνετε τον κώδικά σας πιο αποτελεσματικό μέσω συγχρονισμού ή παραλληλισμού, ανεξάρτητα από το αν εργάζεστε με διεργασίες συνδεδεμένες με CPU ή I/O.