Χρησιμοποιήστε αυτές τις τεχνικές για να εκτελέσετε τον κώδικα ταυτόχρονα και να παρέχετε μια πιο ομαλή εμπειρία χρήστη.
Βασικά Takeaways
- Η συγχρονικότητα και ο παραλληλισμός είναι θεμελιώδεις αρχές της εκτέλεσης εργασιών στους υπολογιστές, με το καθένα να έχει τα ξεχωριστά χαρακτηριστικά του.
- Η ταυτόχρονη χρήση επιτρέπει την αποτελεσματική χρήση των πόρων και τη βελτιωμένη απόκριση των εφαρμογών, ενώ ο παραλληλισμός είναι ζωτικής σημασίας για τη βέλτιστη απόδοση και επεκτασιμότητα.
- Η Python παρέχει επιλογές για χειρισμό ταυτόχρονης λειτουργίας, όπως threading και ασύγχρονο προγραμματισμό με asyncio, καθώς και παραλληλισμό χρησιμοποιώντας τη μονάδα πολλαπλής επεξεργασίας.
Ο συγχρονισμός και ο παραλληλισμός είναι δύο τεχνικές που σας επιτρέπουν να εκτελέσετε πολλά προγράμματα ταυτόχρονα. Η Python έχει πολλές επιλογές για τον χειρισμό εργασιών ταυτόχρονα και παράλληλα, κάτι που μπορεί να προκαλέσει σύγχυση.
Εξερευνήστε τα εργαλεία και τις βιβλιοθήκες που είναι διαθέσιμα για τη σωστή εφαρμογή της ταυτότητος και του παραλληλισμού στην Python και πώς διαφέρουν.
Κατανόηση της Συγχρονικότητας και του Παραλληλισμού
Ο συγχρονισμός και ο παραλληλισμός αναφέρονται σε δύο θεμελιώδεις αρχές της εκτέλεσης εργασιών στους υπολογιστές. Το καθένα έχει τα δικά του χαρακτηριστικά.
- Συγχρονισμός είναι η ικανότητα ενός προγράμματος να διαχειρίζεται πολλές εργασίες ταυτόχρονα χωρίς απαραίτητα να τις εκτελεί την ίδια ακριβώς στιγμή. Περιστρέφεται γύρω από την ιδέα της παρεμβολής εργασιών, εναλλαγής μεταξύ τους με τρόπο που φαίνεται ταυτόχρονα.
- Παραλληλισμός, από την άλλη πλευρά, περιλαμβάνει την εκτέλεση πολλαπλών εργασιών πραγματικά παράλληλα. Συνήθως εκμεταλλεύεται πολλαπλούς πυρήνες ή επεξεργαστές CPU. Το Parallelism επιτυγχάνει πραγματική ταυτόχρονη εκτέλεση, επιτρέποντάς σας να εκτελείτε εργασίες γρηγορότερα και είναι κατάλληλος για υπολογιστικά εντατικές λειτουργίες.
Η σημασία της ταυτότητος και του παραλληλισμού
Η ανάγκη για συγχρονισμό και παραλληλισμό στους υπολογιστές δεν μπορεί να υπερεκτιμηθεί. Να γιατί αυτές οι τεχνικές έχουν σημασία:
- Εκμετάλλευση πόρων: Η ταυτόχρονη χρήση επιτρέπει την αποτελεσματική χρήση των πόρων του συστήματος, διασφαλίζοντας ότι οι εργασίες σημειώνουν ενεργή πρόοδο αντί να περιμένουν αδιάφορα τους εξωτερικούς πόρους.
- Αποκριτικότητα: Η ταυτόχρονη χρήση μπορεί να βελτιώσει την ανταπόκριση των εφαρμογών, ειδικά σε σενάρια που αφορούν διεπαφές χρήστη ή διακομιστές ιστού.
- Εκτέλεση: Ο παραλληλισμός είναι ζωτικής σημασίας για την επίτευξη βέλτιστης απόδοσης, ιδιαίτερα σε εργασίες που συνδέονται με την CPU, όπως σύνθετοι υπολογισμοί, επεξεργασία δεδομένων και προσομοιώσεις.
- Επεκτασιμότητα: Τόσο ο συγχρονισμός όσο και ο παραλληλισμός είναι απαραίτητες για την κατασκευή κλιμακούμενων συστημάτων.
- Προστασία του μέλλοντος: Καθώς οι τάσεις του υλικού συνεχίζουν να ευνοούν τους επεξεργαστές πολλαπλών πυρήνων, η δυνατότητα αξιοποίησης του παραλληλισμού θα γίνεται όλο και πιο απαραίτητη.
Συγχρονισμός σε Python
Μπορείτε να επιτύχετε ταυτόχρονη χρήση στην Python χρησιμοποιώντας threading και ασύγχρονο προγραμματισμό με τη βιβλιοθήκη asyncio.
Threading σε Python
Το Threading είναι ένας μηχανισμός ταυτόχρονης Python που σας επιτρέπει να δημιουργείτε και να διαχειρίζεστε εργασίες σε μια ενιαία διαδικασία. Τα νήματα είναι κατάλληλα για ορισμένους τύπους εργασιών, ιδιαίτερα εκείνες που είναι συνδεδεμένες με I/O και μπορούν να επωφεληθούν από την ταυτόχρονη εκτέλεση.
της 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',
]# function to request a URL
defdownload_url(url):
response = requests.get(url)
print(f"Downloaded {url} - Status Code: {response.status_code}")# Execute without threads and measure execution time
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")# Execute with threads, resetting the time to measure new execution time
start_time = time.time()
threads = []for url in urls:
thread = threading.Thread(target=download_url, args=(url,))
thread.start()
threads.append(thread)# Wait for all threads to complete
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',
]# asynchronous function to request URL
asyncdefdownload_url(url):
asyncwith aiohttp.ClientSession() as session:
asyncwith session.get(url) as response:
content = await response.text()
print(f"Downloaded {url} - Status Code: {response.status}")# Main asynchronous function
asyncdefmain():
# Create a list of tasks to download each URL concurrently
tasks = [download_url(url) for url in urls]# Gather and execute the tasks concurrently
await asyncio.gather(*tasks)start_time = time.time()
# Run the main asynchronous function
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',
]# function to request a URL
defdownload_url(url):
response = requests.get(url)
print(f"Downloaded {url} - Status Code: {response.status_code}")defmain():
# Create a multiprocessing pool with a specified number of processes
num_processes = len(urls)
pool = multiprocessing.Pool(processes=num_processes)start_time = time.time()
pool.map(download_url, urls)
end_time = time.time()# Close the pool and wait for all processes to finish
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.