Skorzystaj z tych technik, aby jednocześnie uruchomić kod i zapewnić płynniejszą obsługę użytkownika.
Kluczowe dania na wynos
- Współbieżność i równoległość to podstawowe zasady wykonywania zadań w informatyce, a każda z nich ma swoją odrębną charakterystykę.
- Współbieżność pozwala na efektywne wykorzystanie zasobów i lepszą responsywność aplikacji, natomiast równoległość jest kluczowa dla optymalnej wydajności i skalowalności.
- Python zapewnia opcje obsługi współbieżności, takie jak wątki i programowanie asynchroniczne z asyncio, a także równoległość przy użyciu modułu wieloprocesorowego.
Współbieżność i równoległość to dwie techniki umożliwiające jednoczesne uruchamianie kilku programów. Python oferuje wiele opcji jednoczesnej i równoległej obsługi zadań, co może być mylące.
Poznaj narzędzia i biblioteki dostępne do prawidłowego wdrażania współbieżności i równoległości w Pythonie oraz różnice między nimi.
Zrozumienie współbieżności i równoległości
Współbieżność i równoległość odnoszą się do dwóch podstawowych zasad wykonywania zadań w informatyce. Każdy ma swoje odrębne cechy.
- Konkurencja to zdolność programu do jednoczesnego zarządzania wieloma zadaniami, bez konieczności wykonywania ich dokładnie w tym samym czasie. Opiera się na idei przeplatania zadań, przełączania się między nimi w sposób sprawiający wrażenie jednoczesnego.
- Równoległośćz drugiej strony polega na wykonywaniu wielu zadań rzeczywiście równolegle. Zwykle korzysta wiele rdzeni lub procesorów procesora. Równoległość zapewnia prawdziwie jednoczesne wykonanie, umożliwiając szybsze wykonywanie zadań i dobrze nadaje się do operacji wymagających intensywnych obliczeń.
Znaczenie współbieżności i równoległości
Nie można przecenić potrzeby współbieżności i równoległości w informatyce. Oto dlaczego te techniki są tak ważne:
- Utylizacja zasobów: Współbieżność pozwala na efektywne wykorzystanie zasobów systemowych, zapewniając, że zadania aktywnie postępują, a nie bezczynnie czekają na zasoby zewnętrzne.
- Reakcja na coś: Współbieżność może poprawić czas reakcji aplikacji, szczególnie w scenariuszach obejmujących interfejsy użytkownika lub serwery internetowe.
- Wydajność: Równoległość ma kluczowe znaczenie dla osiągnięcia optymalnej wydajności, szczególnie w zadaniach obciążających procesor, takich jak złożone obliczenia, przetwarzanie danych i symulacje.
- Skalowalność: Zarówno współbieżność, jak i równoległość są niezbędne do budowania skalowalnych systemów.
- Przyszłościowe: Ponieważ trendy sprzętowe w dalszym ciągu faworyzują procesory wielordzeniowe, możliwość wykorzystania równoległości będzie coraz bardziej konieczna.
Współbieżność w Pythonie
Współbieżność w Pythonie można osiągnąć za pomocą wątków i programowania asynchronicznego za pomocą biblioteki asyncio.
Threading w Pythonie
Threading to mechanizm współbieżności w języku Python, który umożliwia tworzenie zadań i zarządzanie nimi w ramach jednego procesu. Wątki nadają się do niektórych typów zadań, szczególnie tych związanych z operacjami we/wy i mogą czerpać korzyści ze współbieżnego wykonywania.
Pythona gwintowanie moduł zapewnia interfejs wysokiego poziomu do tworzenia wątków i zarządzania nimi. Chociaż GIL (Global Interpreter Lock) ogranicza wątki pod względem prawdziwej równoległości, nadal mogą one osiągnąć współbieżność poprzez efektywne przeplatanie zadań.
Poniższy kod przedstawia przykładową implementację współbieżności przy użyciu wątków. Wykorzystuje bibliotekę żądań Pythona do wysyłania żądania HTTP, co jest typowym zadaniem blokowania we/wy. Wykorzystuje także moduł time do obliczania czasu wykonania.
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")
Uruchamiając ten program, powinieneś zobaczyć, o ile szybsze są żądania wątkowe niż żądania sekwencyjne. Chociaż różnica to tylko ułamek sekundy, można wyraźnie zauważyć poprawę wydajności podczas używania wątków do zadań związanych z we/wy.
Programowanie asynchroniczne za pomocą Asynccio
asyncio udostępnia pętlę zdarzeń, która zarządza zadaniami asynchronicznymi zwanymi współprogramami. Współprogramy to funkcje, które można wstrzymywać i wznawiać, co czyni je idealnymi do zadań związanych z we/wy. Biblioteka jest szczególnie przydatna w scenariuszach, w których zadania wymagają oczekiwania na zasoby zewnętrzne, takie jak żądania sieciowe.
Możesz zmodyfikować poprzedni przykład wysyłania żądań, aby z nim pracować 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")
Za pomocą kodu możesz jednocześnie pobierać strony internetowe, korzystając z asyncio i korzystaj z asynchronicznych operacji we/wy. Może to być bardziej wydajne niż wątki w przypadku zadań związanych z we/wy.
Równoległość w Pythonie
Możesz zaimplementować równoległość za pomocą Pythona wieloprocesorowość moduł, co pozwala w pełni wykorzystać możliwości procesorów wielordzeniowych.
Wieloprocesorowość w Pythonie
Pythona wieloprocesorowość moduł umożliwia osiągnięcie równoległości poprzez utworzenie oddzielnych procesów, każdy z własnym interpreterem Pythona i przestrzenią pamięci. To skutecznie omija globalną blokadę interpretera (GIL), dzięki czemu nadaje się do zadań związanych z procesorem.
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()
W tym przykładzie wieloprocesorowość uruchamia wiele procesów, umożliwiając pobierz_url funkcja działająca równolegle.
Kiedy używać współbieżności lub równoległości
Wybór pomiędzy współbieżnością a równoległością zależy od charakteru zadań i dostępnych zasobów sprzętowych.
Można używać współbieżności podczas wykonywania zadań związanych z we/wy, takich jak odczyt i zapis do plików lub wysyłanie żądań sieciowych oraz gdy problemem są ograniczenia pamięci.
Używaj przetwarzania wieloprocesowego, jeśli masz zadania powiązane z procesorem, które mogą skorzystać na prawdziwej równoległości, i gdy masz solidną izolację między zadaniami, gdzie awaria jednego zadania nie powinna mieć wpływu na inne.
Wykorzystaj współbieżność i równoległość
Równoległość i współbieżność to skuteczne sposoby poprawy responsywności i wydajności kodu Pythona. Ważne jest, aby zrozumieć różnice między tymi koncepcjami i wybrać najskuteczniejszą strategię.
Python oferuje narzędzia i moduły potrzebne do zwiększenia efektywności kodu poprzez współbieżność lub równoległość, niezależnie od tego, czy pracujesz z procesami związanymi z procesorem, czy związanymi z we/wy.