Съдържание
Ключови изводи
- Паралелността и паралелността са фундаментални принципи за изпълнение на задачи в компютърната техника, като всеки от тях има своите различни характеристики.
- Паралелността позволява ефективно използване на ресурсите и подобрена реакция на приложенията, докато паралелизмът е от решаващо значение за оптимална производителност и мащабируемост.
- Python предоставя опции за обработка на паралелност, като нишки и асинхронно програмиране с asyncio, както и паралелизъм с помощта на мултипроцесорния модул.
Паралелността и паралелността са две техники, които ви позволяват да изпълнявате няколко програми едновременно. Python има множество опции за обработка на задачи едновременно и паралелно, което може да бъде объркващо.
Разгледайте наличните инструменти и библиотеки за правилно прилагане на едновременност и паралелизъм в Python и как се различават.
Разбиране на едновременността и паралелизма
Паралелността и паралелността се отнасят до два фундаментални принципа за изпълнение на задачи в изчисленията. Всеки има своите отличителни характеристики.
Значението на едновременността и паралелизма
Необходимостта от едновременност и паралелизъм в изчисленията не може да бъде надценена. Ето защо тези техники имат значение:
Паралелност в Python
Можете да постигнете едновременност в Python, като използвате нишки и асинхронно програмиране с библиотеката asyncio.
Нишки в 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',
]
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")
Изпълнявайки тази програма, трябва да видите колко по-бързи са нишковидните заявки от последователните заявки. Въпреки че разликата е само част от секундата, получавате ясно усещане за подобрението на производителността, когато използвате нишки за I/O-обвързани задачи.
Асинхронно програмиране с 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 операции. Това може да бъде по-ефективно от нишките за I/O-обвързани задачи.
Паралелизъм в Python
Можете да реализирате паралелизъм, като използвате Мултипроцесорният модул на Pythonкоето ви позволява да се възползвате напълно от многоядрените процесори.
Многопроцесорна обработка в Python
Мултипроцесорният модул на Python предоставя начин за постигане на паралелизъм чрез създаване на отделни процеси, всеки със собствен интерпретатор на Python и пространство в паметта. Това ефективно заобикаля Global Interpreter Lock (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 да работи паралелно.
Кога да използвате едновременност или паралелизъм
Изборът между едновременност и паралелизъм зависи от естеството на вашите задачи и наличните хардуерни ресурси.
Можете да използвате паралелност, когато се занимавате с I/O-обвързани задачи, като четене и писане на файлове или правене на мрежови заявки, и когато ограниченията на паметта са проблем.
Използвайте мултипроцесиране, когато имате задачи, обвързани с процесора, които могат да се възползват от истинския паралелизъм и когато имате стабилна изолация между задачите, където отказът на една задача не трябва да оказва влияние върху други.
Възползвайте се от едновременността и паралелизма
Паралелизмът и паралелността са ефективни начини за подобряване на отзивчивостта и производителността на вашия Python код. Важно е да разберете разликите между тези концепции и да изберете най-ефективната стратегия.
Python предлага инструментите и модулите, от които се нуждаете, за да направите кода си по-ефективен чрез едновременност или паралелизъм, независимо дали работите с обвързани с процесора или I/O процеси.