Ключові висновки
- Одночасність і паралелізм є фундаментальними принципами виконання завдань в обчислювальній техніці, кожен з яких має свої відмінні характеристики.
- Паралелізм забезпечує ефективне використання ресурсів і покращує швидкість реагування програм, тоді як паралелізм має вирішальне значення для оптимальної продуктивності та масштабованості.
- Python надає параметри для керування паралелізмом, такі як потокове та асинхронне програмування з asyncio, а також паралелізм за допомогою багатопроцесорного модуля.
Паралелізм і паралелізм — це дві техніки, які дозволяють запускати декілька програм одночасно. Python має кілька варіантів одночасної та паралельної обробки завдань, що може заплутати.
Ознайомтеся з інструментами та бібліотеками, доступними для правильної реалізації паралелізму та паралелізму в Python, і чим вони відрізняються.
Розуміння паралельності та паралелізму
Одночасність і паралелізм відносяться до двох фундаментальних принципів виконання завдань в обчислювальній техніці. Кожен має свої відмінні характеристики.
Важливість паралельності та паралелізму
Неможливо переоцінити потребу в паралельності та паралелізмі в обчисленнях. Ось чому ці методи важливі:
Паралелізм у Python
Ви можете досягти паралелізму в Python за допомогою потоків і асинхронного програмування з бібліотекою asyncio.
Потоки в Python
Потоковість — це механізм паралельного виконання Python, який дозволяє створювати завдання та керувати ними в одному процесі. Потоки підходять для певних типів завдань, особливо для тих, які пов’язані з вводом-виводом і можуть виграти від одночасного виконання.
Модуль потоків Python надає високорівневий інтерфейс для створення потоків і керування ними. Хоча GIL (Global Interpreter Lock) обмежує потоки з точки зору справжнього паралелізму, вони все одно можуть досягти паралелізму шляхом ефективного чергування завдань.
Наведений нижче код показує приклад реалізації паралелізму за допомогою потоків. Він використовує бібліотеку запитів Python для надсилання HTTP-запиту, звичайного завдання блокування вводу-виводу. Він також використовує модуль часу для обчислення часу виконання.
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")
Запустивши цю програму, ви побачите, наскільки швидші потокові запити, ніж послідовні. Незважаючи на те, що різниця становить лише частки секунди, ви отримуєте чітке уявлення про підвищення продуктивності, використовуючи потоки для завдань, пов’язаних із введенням-виведенням.
Асинхронне програмування за допомогою Asyncio
asyncio забезпечує цикл подій, який керує асинхронними завданнями, які називаються співпрограмами. Співпрограми — це функції, які можна призупинити та відновити, що робить їх ідеальними для завдань, пов’язаних із введенням-виведенням. Бібліотека особливо корисна для сценаріїв, коли завдання передбачають очікування зовнішніх ресурсів, наприклад мережевих запитів.
Ви можете змінити попередній приклад надсилання запиту для роботи з 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 та використовувати переваги асинхронних операцій введення-виведення. Це може бути більш ефективним, ніж потокове виконання завдань, пов’язаних із вводом-виводом.
Паралелізм у Python
Ви можете реалізувати паралелізм за допомогою Багатопроцесорний модуль Pythonщо дозволяє повною мірою використовувати переваги багатоядерних процесорів.
Багатопроцесорність у Python
Багатопроцесорний модуль Python забезпечує спосіб досягнення паралелізму шляхом створення окремих процесів, кожен з яких має власний інтерпретатор Python і простір пам’яті. Це ефективно обходить глобальне блокування інтерпретатора (GIL), що робить його придатним для завдань, пов’язаних із процесором.
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 працювати паралельно.
Коли використовувати паралельність чи паралелізм
Вибір між паралелізмом і паралелізмом залежить від характеру ваших завдань і доступних апаратних ресурсів.
Ви можете використовувати паралелізм під час виконання завдань, пов’язаних із вводом-виводом, таких як читання та запис у файли чи надсилання мережевих запитів, а також у випадках обмеження пам’яті.
Використовуйте багатопроцесорність, якщо у вас є завдання, пов’язані з процесором, які можуть виграти від справжнього паралелізму, і якщо у вас є надійна ізоляція між завданнями, де збій одного завдання не повинен впливати на інші.
Скористайтеся перевагами паралельності та паралелізму
Паралелізм і паралелізм є ефективними способами покращити швидкість реагування та продуктивність вашого коду Python. Важливо розуміти різницю між цими поняттями та вибрати найбільш ефективну стратегію.
Python пропонує інструменти та модулі, необхідні для підвищення ефективності вашого коду за рахунок паралелізму чи паралелізму, незалежно від того, чи працюєте ви з процесами, пов’язаними з ЦП, чи з процесами введення/виведення.