Користите ове технике за истовремено покретање кода и пружање лакшег корисничког искуства.

Кључне Такеаваис

  • Конкурентност и паралелизам су основни принципи извршавања задатака у рачунарству, при чему сваки има своје посебне карактеристике.
  • Конкуренција омогућава ефикасно коришћење ресурса и побољшани одзив апликација, док је паралелизам кључан за оптималне перформансе и скалабилност.
  • Питхон пружа опције за руковање паралелношћу, као што су нити и асинхроно програмирање са асинцио, као и паралелизам помоћу модула за више процеса.

Конкурентност и паралелизам су две технике које вам омогућавају да истовремено покренете неколико програма. Питхон има више опција за истовремено и паралелно руковање задацима, што може бити збуњујуће.

Истражите алате и библиотеке доступне за исправну имплементацију конкурентности и паралелизма у Питхон-у и по чему се они разликују.

Разумевање конкурентности и паралелизма

Конкурентност и паралелизам се односе на два основна принципа извршавања задатака у рачунарству. Сваки има своје посебне карактеристике.

instagram viewer
  1. Конкуренција је способност програма да управља са више задатака у исто време, а да не мора да их извршава у исто време. Окреће се око идеје преплитања задатака, пребацивања између њих на начин који изгледа истовремено.
  2. Паралелизам, с друге стране, укључује извршавање више задатака истински паралелно. Обично користи предности више ЦПУ језгара или процесора. Паралелизам постиже истинско истовремено извршавање, омогућавајући вам да брже обављате задатке и добро је погодан за рачунарски интензивне операције.

Важност конкурентности и паралелизма

Потреба за конкурентношћу и паралелизмом у рачунарству не може се преценити. Ево зашто су ове технике важне:

  1. Коришћење ресурса: Конкуренција омогућава ефикасно коришћење системских ресурса, обезбеђујући да задаци активно напредују уместо да беспослено чекају спољне ресурсе.
  2. Респонсивенесс: Конкуренција може побољшати одзив апликација, посебно у сценаријима који укључују корисничке интерфејсе или веб сервере.
  3. Перформансе: Паралелизам је кључан за постизање оптималних перформанси, посебно у задацима везаним за ЦПУ као што су сложена израчунавања, обрада података и симулације.
  4. Прилагодљивост: И конкурентност и паралелизам су неопходни за изградњу скалабилних система.
  5. Отпорност на будућност: Како хардверски трендови настављају да фаворизују процесоре са више језгара, способност да се искористи паралелизам ће постати све потребнија.

Конкуренција у Питхон-у

Можете постићи паралелност у Питхон-у коришћењем нити и асинхроног програмирања са асинцио библиотеком.

Тхреадинг у Питхон-у

Тхреадинг је Питхон механизам конкурентности који вам омогућава да креирате и управљате задацима у оквиру једног процеса. Нити су погодне за одређене врсте задатака, посебно оне који су И/О везани и могу имати користи од истовременог извршавања.

Питхон'с навојем модул пружа интерфејс високог нивоа за креирање и управљање нитима. Док ГИЛ (Глобално закључавање тумача) ограничава нити у смислу правог паралелизма, оне и даље могу постићи конкурентност ефикасним преплитањем задатака.

Код у наставку приказује пример имплементације конкурентности помоћу нити. Користи Питхон библиотеку захтева за слање ХТТП захтева, уобичајеног задатка блокирања И/О. Такође користи временски модул за израчунавање времена извршења.

import requests
import time
import threading

urls = [
'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")

Покретањем овог програма требало би да видите колико су захтеви са нитима бржи од узастопних захтева. Иако је разлика само делић секунде, добијате јасан осећај побољшања перформанси када користите нити за задатке везане за У/И.

Асинхроно програмирање са Асинцио

асинцио обезбеђује петљу догађаја која управља асинхроним задацима званим корутине. Корутине су функције које можете паузирати и наставити, што их чини идеалним за задатке везане за У/И. Библиотека је посебно корисна за сценарије у којима задаци укључују чекање на спољне ресурсе, као што су мрежни захтеви.

Можете да измените претходни пример слања захтева за рад асинцио:

import asyncio
import aiohttp
import time

urls = [
'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")

Користећи код, можете истовремено преузимати веб странице користећи асинцио и искористите предности асинхроних И/О операција. Ово може бити ефикасније од нити за У/И везане задатке.

Паралелизам у Пајтону

Паралелизам можете имплементирати користећи Питхон'с мултипроцесирање модул, што вам омогућава да у потпуности искористите предности вишејезгарних процесора.

Вишепроцесирање у Питхон-у

Питхон'с мултипроцесирање модул пружа начин да се постигне паралелизам креирањем одвојених процеса, сваки са сопственим Питхон интерпретатором и меморијским простором. Ово ефективно заобилази Глобално закључавање тумача (ГИЛ), што га чини погодним за задатке везане за ЦПУ.

import requests
import multiprocessing
import time

urls = [
'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()

У овом примеру, мултипроцесирање покреће више процеса, омогућавајући довнлоад_урл функција да ради паралелно.

Када користити истовременост или паралелизам

Избор између конкурентности и паралелизма зависи од природе ваших задатака и доступних хардверских ресурса.

Можете користити истовременост када се бавите задацима везаним за У/И, као што је читање и писање у датотеке или постављање мрежних захтева, и када су ограничења меморије забринута.

Користите вишепроцесирање када имате задатке везане за ЦПУ који могу имати користи од правог паралелизма и када имате чврсту изолацију између задатака, где неуспех једног задатка не би требало да утиче на друге.

Искористите предност истовремености и паралелизма

Паралелизам и конкурентност су ефикасни начини за побољшање одзива и перформанси вашег Питхон кода. Важно је разумети разлике између ових концепата и одабрати најефикаснију стратегију.

Питхон нуди алате и модуле који су вам потребни да учините ваш код ефикаснијим кроз конкурентност или паралелизам, без обзира да ли радите са процесима везаним за ЦПУ или са процесима везаним за У/И.