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

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

Η σημασία της ταυτότητος και του παραλληλισμού
Η ανάγκη για συγχρονισμό και παραλληλισμό στους υπολογιστές δεν μπορεί να υπερεκτιμηθεί. Να γιατί αυτές οι τεχνικές έχουν σημασία:
Συγχρονισμός σε 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 threadingurls = [
'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.
Ασύγχρονος Προγραμματισμός με Asyncio
asyncio παρέχει έναν βρόχο συμβάντων που διαχειρίζεται ασύγχρονες εργασίες που ονομάζονται κορουτίνες. Οι κορουτίνες είναι λειτουργίες τις οποίες μπορείτε να θέσετε σε παύση και να συνεχίσετε, καθιστώντας τις ιδανικές για εργασίες που συνδέονται με I/O. Η βιβλιοθήκη είναι ιδιαίτερα χρήσιμη για σενάρια όπου οι εργασίες περιλαμβάνουν αναμονή εξωτερικών πόρων, όπως αιτήματα δικτύου.
Μπορείτε να τροποποιήσετε το προηγούμενο παράδειγμα αποστολής αιτήματος για να εργαστείτε με το asyncio:
import asyncio
import aiohttp
import timeurls = [
'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.
Παραλληλισμός στην Python
Μπορείτε να εφαρμόσετε παραλληλισμό χρησιμοποιώντας Η ενότητα πολλαπλής επεξεργασίας της Pythonπου σας επιτρέπει να εκμεταλλευτείτε πλήρως τους πολυπύρηνους επεξεργαστές.
Πολυεπεξεργασία σε Python
Η λειτουργική μονάδα πολλαπλής επεξεργασίας της Python παρέχει έναν τρόπο επίτευξης παραλληλισμού δημιουργώντας ξεχωριστές διεργασίες, η καθεμία με τον δικό της διερμηνέα Python και χώρο μνήμης. Αυτό παρακάμπτει αποτελεσματικά το Παγκόσμιο Κλείδωμα Διερμηνέα (GIL), καθιστώντας το κατάλληλο για εργασίες που συνδέονται με την CPU.
import requests
import multiprocessing
import timeurls = [
'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.