Uporabite te tehnike za hkratno izvajanje kode in zagotavljanje bolj gladke uporabniške izkušnje.

Ključni zaključki

  • Sočasnost in vzporednost sta temeljni načeli izvajanja nalog v računalništvu, pri čemer ima vsako svoje posebne značilnosti.
  • Sočasnost omogoča učinkovito uporabo virov in izboljšano odzivnost aplikacij, vzporednost pa je ključnega pomena za optimalno delovanje in razširljivost.
  • Python ponuja možnosti za ravnanje s sočasnostjo, kot je navojno in asinhrono programiranje z asyncio, kot tudi vzporednost z uporabo večprocesnega modula.

Sočasnost in vzporednost sta dve tehniki, ki omogočata izvajanje več programov hkrati. Python ima več možnosti za sočasno in vzporedno obravnavanje nalog, kar je lahko zmedeno.

Raziščite orodja in knjižnice, ki so na voljo za pravilno implementacijo sočasnosti in vzporednosti v Pythonu, in v čem se razlikujejo.

Razumevanje sočasnosti in vzporednosti

Sočasnost in vzporednost se nanašata na dve temeljni načeli izvajanja nalog v računalništvu. Vsak ima svoje posebne značilnosti.

instagram viewer
  1. Sočasnost je zmožnost programa, da upravlja več nalog hkrati, ne da bi jih nujno izvršil ob istem času. Vrti se okoli ideje prepletanja nalog, preklapljanja med njimi na način, ki se zdi istočasno.
  2. Paralelizem, po drugi strani pa vključuje resnično vzporedno izvajanje več nalog. Običajno izkoristi več CPU jeder ali procesorjev. Paralelizem doseže resnično sočasno izvajanje, kar vam omogoča hitrejše izvajanje nalog in je zelo primeren za računalniško intenzivne operacije.

Pomen sočasnosti in vzporednosti

Potrebe po sočasnosti in vzporednosti v računalništvu ni mogoče preceniti. Evo zakaj so te tehnike pomembne:

  1. Uporaba virov: Sočasnost omogoča učinkovito uporabo sistemskih virov, kar zagotavlja, da naloge aktivno napredujejo, namesto da leno čakajo na zunanje vire.
  2. Odzivnost: Sočasnost lahko izboljša odzivnost aplikacij, zlasti v scenarijih, ki vključujejo uporabniške vmesnike ali spletne strežnike.
  3. Izvedba: Paralelizem je ključnega pomena za doseganje optimalne zmogljivosti, zlasti pri opravilih, vezanih na CPE, kot so kompleksni izračuni, obdelava podatkov in simulacije.
  4. Razširljivost: Sočasnost in vzporednost sta bistvenega pomena za gradnjo razširljivih sistemov.
  5. Odpornost na prihodnost: Ker so trendi strojne opreme še naprej naklonjeni večjedrnim procesorjem, bo zmožnost izkoriščanja paralelizma postajala vse bolj potrebna.

Sočasnost v Pythonu

V Pythonu lahko dosežete sočasnost z uporabo niti in asinhronega programiranja s knjižnico asyncio.

Niti v Pythonu

Threading je mehanizem sočasnosti Python, ki vam omogoča ustvarjanje in upravljanje nalog znotraj enega samega procesa. Niti so primerne za nekatere vrste nalog, zlasti tiste, ki so vezane na V/I in imajo lahko koristi od sočasnega izvajanja.

Pythonov vrezovanje navojev modul ponuja vmesnik na visoki ravni za ustvarjanje in upravljanje niti. Medtem ko GIL (Global Interpreter Lock) omejuje niti v smislu pravega paralelizma, lahko še vedno dosežejo sočasnost z učinkovitim prepletanjem nalog.

Spodnja koda prikazuje primer izvedbe sočasnosti z uporabo niti. Uporablja knjižnico zahtev Python za pošiljanje zahteve HTTP, ki je običajna naloga blokiranja V/I. Uporablja tudi časovni modul za izračun časa izvajanja.

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")

Če zaženete ta program, bi morali videti, koliko hitrejše so nitne zahteve od zaporednih zahtev. Čeprav je razlika le delček sekunde, dobite jasen občutek izboljšanja zmogljivosti pri uporabi niti za opravila, vezana na V/I.

Asinhrono programiranje z Asyncio

asyncio zagotavlja zanko dogodkov, ki upravlja asinhrone naloge, imenovane korutine. Korutine so funkcije, ki jih lahko začasno ustavite in nadaljujete, zaradi česar so idealne za opravila, povezana z V/I. Knjižnica je še posebej uporabna za scenarije, kjer opravila vključujejo čakanje na zunanje vire, kot so omrežne zahteve.

Prejšnji primer pošiljanja zahteve lahko spremenite za delo asyncio:

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")

S kodo lahko hkrati prenašate spletne strani z uporabo asyncio in izkoristite prednosti asinhronih V/I operacij. To je lahko učinkovitejše od niti za opravila, vezana na V/I.

Paralelizem v Pythonu

Paralelizem lahko izvedete z uporabo Pythonov večprocesiranje modul, ki vam omogoča, da v celoti izkoristite prednosti večjedrnih procesorjev.

Večprocesiranje v Pythonu

Pythonov večprocesiranje modul ponuja način za doseganje vzporednosti z ustvarjanjem ločenih procesov, od katerih ima vsak svoj tolmač Python in pomnilniški prostor. To učinkovito zaobide Global Interpreter Lock (GIL), zaradi česar je primerno za naloge, vezane na CPE.

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()

V tem primeru večprocesiranje sproži več procesov, kar omogoča download_url funkcija za vzporedno delovanje.

Kdaj uporabiti sočasnost ali vzporednost

Izbira med sočasnostjo in vzporednostjo je odvisna od narave vaših nalog in razpoložljivih virov strojne opreme.

Sočasnost lahko uporabite pri opravilih, vezanih na V/I, kot je npr branje in pisanje v datoteke ali izdelovanje omrežnih zahtev in ko so omejitve pomnilnika zaskrbljujoče.

Uporabite večprocesiranje, ko imate naloge, vezane na CPE, ki lahko koristijo resničnemu paralelizmu, in ko imate močno izolacijo med nalogami, kjer napaka ene naloge ne bi smela vplivati ​​na druge.

Izkoristite sočasnost in vzporednost

Paralelizem in sočasnost sta učinkovita načina za izboljšanje odzivnosti in zmogljivosti vaše kode Python. Pomembno je razumeti razlike med temi pojmi in izbrati najučinkovitejšo strategijo.

Python ponuja orodja in module, ki jih potrebujete za večjo učinkovitost vaše kode s sočasnostjo ali vzporednostjo, ne glede na to, ali delate s procesi, vezanimi na CPE ali V/I.