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