Izmantojiet šīs metodes, lai vienlaikus palaistu kodu un nodrošinātu vienmērīgāku lietotāja pieredzi.

Key Takeaways

  • Vienlaicība un paralēlisms ir uzdevumu izpildes pamatprincipi skaitļošanā, un katram no tiem ir savas atšķirīgas īpašības.
  • Vienlaicība ļauj efektīvi izmantot resursus un uzlabot lietojumprogrammu atsaucību, savukārt paralēlisms ir ļoti svarīgs optimālai veiktspējai un mērogojamībai.
  • Python nodrošina iespējas apstrādāt vienlaicīgumu, piemēram, pavedienu veidošanu un asinhrono programmēšanu ar asyncio, kā arī paralēlismu, izmantojot vairāku apstrādes moduli.

Vienlaicība un paralēlisms ir divi paņēmieni, kas ļauj vienlaikus palaist vairākas programmas. Python ir vairākas iespējas vienlaikus un paralēli apstrādāt uzdevumus, kas var radīt neskaidrības.

Izpētiet pieejamos rīkus un bibliotēkas, lai Python pareizi ieviestu vienlaicīgumu un paralēlismu, un to atšķirības.

Izpratne par sakritību un paralēlismu

Vienlaicība un paralēlisms attiecas uz diviem uzdevuma izpildes pamatprincipiem skaitļošanā. Katrai no tām ir savas atšķirīgās īpašības.

instagram viewer
  1. Vienlaicīgums ir programmas spēja pārvaldīt vairākus uzdevumus vienlaikus, ne vienmēr tos izpildot tieši tajā pašā laikā. Tas ir saistīts ar ideju par uzdevumu savstarpēju pārslēgšanu, pārslēgšanos starp tiem tādā veidā, kas šķiet vienlaikus.
  2. Paralēlismsno otras puses, tas ietver vairāku uzdevumu patiesu izpildi paralēli. Tas parasti izmanto priekšrocības vairāki CPU kodoli vai procesori. Paralēlisms nodrošina patiesu vienlaicīgu izpildi, ļaujot jums veikt uzdevumus ātrāk, un tas ir labi piemērots skaitļošanas ziņā intensīvām darbībām.

Vienlaicības un paralēlisma nozīme

Vienlaicīguma un paralēlisma nepieciešamību skaitļošanā nevar pārvērtēt. Lūk, kāpēc šīs metodes ir svarīgas:

  1. Resursu izmantošana: Vienlaicība ļauj efektīvi izmantot sistēmas resursus, nodrošinot, ka uzdevumi aktīvi attīstās, nevis dīki gaida ārējos resursus.
  2. Atsaucība: vienlaicīgums var uzlabot lietojumprogrammu atsaucību, jo īpaši scenārijos, kas saistīti ar lietotāja saskarnēm vai tīmekļa serveriem.
  3. Performance: Paralēlisms ir ļoti svarīgs, lai sasniegtu optimālu veiktspēju, jo īpaši ar CPU saistītos uzdevumos, piemēram, sarežģītos aprēķinos, datu apstrādē un simulācijās.
  4. Mērogojamība: gan vienlaicīgums, gan paralēlisms ir būtiski mērogojamu sistēmu izveidei.
  5. Nākotnes aizsardzība: Tā kā aparatūras tendences turpina dot priekšroku daudzkodolu procesoriem, spēja izmantot paralēlismu kļūs arvien nepieciešama.

Vienlaicība Python

Vienlaicību Python var panākt, izmantojot pavedienu veidošanu un asinhrono programmēšanu ar asyncio bibliotēku.

Pavediens Python

Threading ir Python vienlaicības mehānisms, kas ļauj izveidot un pārvaldīt uzdevumus vienā procesā. Pavedieni ir piemēroti noteikta veida uzdevumiem, īpaši tiem, kas ir saistīti ar I/O un var gūt labumu no vienlaicīgas izpildes.

Python's vītņošana modulis nodrošina augsta līmeņa saskarni pavedienu izveidei un pārvaldībai. Lai gan GIL (Global Interpreter Lock) ierobežo pavedienus patiesā paralēlisma ziņā, tie joprojām var panākt vienlaicīgumu, efektīvi savienojot uzdevumus.

Tālāk esošajā kodā ir parādīts vienlaicības ieviešanas piemērs, izmantojot pavedienus. Tas izmanto Python pieprasījumu bibliotēku, lai nosūtītu HTTP pieprasījumu, kas ir izplatīts I/O bloķēšanas uzdevums. Tas izmanto arī laika modulis, lai aprēķinātu izpildes laiku.

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

Palaižot šo programmu, jums vajadzētu redzēt, cik daudz ātrāki ir vītņotie pieprasījumi nekā secīgie pieprasījumi. Lai gan atšķirība ir tikai sekundes daļa, jums ir skaidrs priekšstats par veiktspējas uzlabošanos, izmantojot pavedienus I/O saistītiem uzdevumiem.

Asinhronā programmēšana ar Asyncio

asyncio nodrošina notikumu cilpu, kas pārvalda asinhronos uzdevumus, ko sauc par korutīnām. Korutīnas ir funkcijas, kuras varat apturēt un atsākt, padarot tās ideāli piemērotas ar I/O saistītiem uzdevumiem. Bibliotēka ir īpaši noderīga scenārijiem, kuros uzdevumi ir saistīti ar ārējo resursu, piemēram, tīkla pieprasījumu, gaidīšanu.

Varat modificēt iepriekšējo pieprasījuma nosūtīšanas piemēru, lai strādātu ar to 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")

Izmantojot kodu, varat lejupielādēt tīmekļa lapas, vienlaikus izmantojot asyncio un izmantojiet asinhrono I/O darbību priekšrocības. Tas var būt efektīvāk nekā vītņošana I/O saistītiem uzdevumiem.

Paralēlisms Python

Jūs varat īstenot paralēlismu, izmantojot Python's daudzapstrāde modulis, kas ļauj pilnībā izmantot daudzkodolu procesoru priekšrocības.

Daudzkārtēja apstrāde programmā Python

Python's daudzapstrāde modulis nodrošina veidu, kā panākt paralēlismu, izveidojot atsevišķus procesus, katram no kuriem ir savs Python tulks un atmiņas vieta. Tas efektīvi apiet Global Interpreter Lock (GIL), padarot to piemērotu CPU saistītiem uzdevumiem.

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

Šajā piemērā daudzapstrāde rada vairākus procesus, ļaujot download_url funkcija darbojas paralēli.

Kad lietot vienlaicīgumu vai paralēlismu

Izvēle starp vienlaicību un paralēlismu ir atkarīga no jūsu uzdevumu rakstura un pieejamajiem aparatūras resursiem.

Varat izmantot vienlaicīgumu, strādājot ar I/O saistītus uzdevumus, piemēram, lasīšana un rakstīšana failos vai veikt tīkla pieprasījumus un ja atmiņas ierobežojumi rada bažas.

Izmantojiet vairāku apstrādi, ja jums ir ar CPU saistīti uzdevumi, kas var gūt labumu no patiesa paralēlisma, un ja jums ir spēcīga izolācija starp uzdevumiem, kur viena uzdevuma kļūmei nevajadzētu ietekmēt citus.

Izmantojiet vienlaicības un paralēlisma priekšrocības

Paralēlisms un vienlaicība ir efektīvi veidi, kā uzlabot Python koda reaģētspēju un veiktspēju. Ir svarīgi saprast atšķirības starp šiem jēdzieniem un izvēlēties visefektīvāko stratēģiju.

Python piedāvā rīkus un moduļus, kas jums nepieciešami, lai padarītu kodu efektīvāku, izmantojot vienlaicīgumu vai paralēlismu, neatkarīgi no tā, vai strādājat ar procesiem, kas saistīti ar CPU vai I/O.