Kasutage neid tehnikaid koodi üheaegseks käitamiseks ja sujuvama kasutuskogemuse pakkumiseks.

Võtmed kaasavõtmiseks

  • Samaaegsus ja paralleelsus on arvutis ülesannete täitmise aluspõhimõtted, millest igaühel on oma eripärad.
  • Samaaegsus võimaldab tõhusat ressursside kasutamist ja rakenduste paremat reageerimisvõimet, samas kui paralleelsus on optimaalse jõudluse ja skaleeritavuse jaoks ülioluline.
  • Python pakub võimalusi samaaegsuse käsitlemiseks, nagu lõimestamine ja asünkroonne programmeerimine asünkrooniga, samuti paralleelsus mitmetöötlusmooduli abil.

Samaaegsus ja paralleelsus on kaks tehnikat, mis võimaldavad teil korraga mitut programmi käivitada. Pythonil on ülesannete samaaegseks ja paralleelseks käsitlemiseks mitu võimalust, mis võib segadust tekitada.

Uurige Pythonis samaaegsuse ja paralleelsuse õigeks rakendamiseks saadaolevaid tööriistu ja teeke ning nende erinevusi.

Samaaegsuse ja paralleelsuse mõistmine

Samaaegsus ja paralleelsus viitavad kahele andmetöötluse ülesannete täitmise põhiprintsiibile. Igal neist on oma eripärad.

instagram viewer
  1. Samaaegsus on programmi võime hallata korraga mitut ülesannet ilma neid tingimata samal ajal täitmata. See keerleb ülesannete põimimise idee ümber, lülitudes nende vahel viisil, mis näib olevat samaaegne.
  2. Paralleelsusseevastu hõlmab mitme ülesande tõeliselt paralleelset täitmist. Tavaliselt kasutab see ära mitu CPU tuuma või protsessorit. Paralleelsus tagab tõelise samaaegse täitmise, võimaldades teil ülesandeid kiiremini täita ja sobib hästi arvutusmahukate toimingute jaoks.

Samaaegsuse ja paralleelsuse tähtsus

Samaaegsuse ja paralleelsuse vajadust andmetöötluses ei saa ülehinnata. Siin on põhjus, miks need tehnikad on olulised:

  1. Ressursikasutus: Samaaegsus võimaldab süsteemiressursse tõhusalt kasutada, tagades, et ülesanded edenevad aktiivselt, mitte ei oota tegevusetult väliseid ressursse.
  2. Vastuvõtlikkus: Samaaegsus võib parandada rakenduste reageerimisvõimet, eriti stsenaariumide puhul, mis hõlmavad kasutajaliideseid või veebiservereid.
  3. Esitus: Paralleelsus on optimaalse jõudluse saavutamiseks ülioluline, eriti protsessoriga seotud ülesannete puhul, nagu keerulised arvutused, andmetöötlus ja simulatsioonid.
  4. Skaleeritavus: Samaaegsus ja paralleelsus on skaleeritavate süsteemide ehitamiseks hädavajalikud.
  5. Tulevikukindel: Kuna riistvara suundumused soosivad jätkuvalt mitmetuumalisi protsessoreid, muutub paralleelsuse kasutamise võimalus üha vajalikumaks.

Samaaegsus Pythonis

Pythonis saate saavutada samaaegsuse, kasutades lõime ja asünkroonset programmeerimist asyncio teegiga.

Lõimimine Pythonis

Threading on Pythoni samaaegsusmehhanism, mis võimaldab teil luua ja hallata ülesandeid ühe protsessi raames. Lõimed sobivad teatud tüüpi ülesannete jaoks, eriti nende jaoks, mis on seotud I/O-ga ja võivad kasu saada samaaegsest täitmisest.

Pythoni oma keermestamine moodul pakub kõrgetasemelist liidest lõimede loomiseks ja haldamiseks. Kuigi GIL (Global Interpreter Lock) piirab lõime tõelise paralleelsuse osas, suudavad need tõhusalt ülesandeid põimides saavutada samaaegsuse.

Allolev kood näitab lõimede abil samaaegsuse rakendamise näidet. See kasutab Pythoni päringu teeki, et saata HTTP-päring, mis on tavaline sisend-/väljundi blokeerimise ülesanne. See kasutab ka ajamoodul täitmisaja arvutamiseks.

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

Selle programmi käivitamisel peaksite nägema, kui palju kiiremad on keermestatud päringud kui järjestikused päringud. Kuigi erinevus on vaid murdosa sekundist, saate I/O-ga seotud ülesannete jaoks lõimede kasutamisel selge ettekujutuse jõudluse paranemisest.

Asünkroonne programmeerimine Asyncioga

asyncio pakub sündmuste tsüklit, mis haldab asünkroonseid ülesandeid, mida nimetatakse korutiinideks. Korutiinid on funktsioonid, mida saate peatada ja jätkata, muutes need ideaalseks I/O-ga seotud ülesannete jaoks. Teek on eriti kasulik stsenaariumide puhul, kus ülesanded hõlmavad väliste ressursside, näiteks võrgupäringute ootamist.

Eelmist päringu saatmise näidet saate töötamiseks muuta 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")

Koodi abil saate alla laadida veebilehti samaaegselt kasutades asyncio ja kasutada ära asünkroonsed I/O-operatsioonid. See võib I/O-ga seotud ülesannete puhul olla tõhusam kui lõimestamine.

Paralleelsus Pythonis

Paralleelsust saate rakendada kasutades Pythoni oma multitöötlus moodul, mis võimaldab teil mitmetuumaliste protsessorite eeliseid täielikult ära kasutada.

Mitmiktöötlus Pythonis

Pythoni oma multitöötlus moodul võimaldab saavutada paralleelsust, luues eraldi protsessid, millest igaühel on oma Pythoni tõlk ja mäluruum. See möödub tõhusalt Global Interpreter Lockist (GIL), muutes selle sobivaks protsessoriga seotud ülesannete jaoks.

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

Selles näites multitöötlus käivitab mitu protsessi, võimaldades download_url funktsioon paralleelselt töötama.

Millal kasutada samaaegsust või paralleelsust

Valik samaaegsuse ja paralleelsuse vahel sõltub teie ülesannete olemusest ja saadaolevatest riistvararessurssidest.

Samaaegsust saate kasutada I/O-ga seotud ülesannete käsitlemisel, näiteks failide lugemine ja kirjutamine või võrgupäringute esitamine ja kui muret valmistavad mälupiirangud.

Kasutage multitöötlust, kui teil on protsessoriga seotud ülesanded, mis võivad tõelisest paralleelsusest kasu saada, ja kui teil on ülesannete vahel tugev isolatsioon, kus ühe ülesande tõrge ei tohiks teisi mõjutada.

Kasutage samaaegsust ja paralleelsust

Paralleelsus ja samaaegsus on tõhusad viisid Pythoni koodi reageerimisvõime ja jõudluse parandamiseks. Oluline on mõista nende mõistete erinevusi ja valida kõige tõhusam strateegia.

Python pakub tööriistu ja mooduleid, mida vajate koodi samaaegse või paralleelsuse kaudu tõhusamaks muutmiseks, olenemata sellest, kas töötate protsessoriga või I/O-ga seotud protsessidega.