Napredne I/O operacije v GO vključujejo več prefinjenih tehnik in mehanizmov, ki presegajo preprosto branje in pisanje datotek. Te operacije izkoriščajo temeljne V/I vmesnike, njegov sočasni model in posebne konstrukcije za optimalno delovanje in prilagodljivost. Spodaj je podrobna razlaga, ki pokriva puferirane V/I, optimizacije V/I na vmesniku, cevi v spominu, asinhrono vedenje V/I in V/I s sočasnimi vzorci.
Bufered I/O.
Ena od temeljnih naprednih tehnik V/I v GO je uporaba puferiranega V/I za optimizacijo zmogljivosti. Paket `bufio` ponuja bralce in pisatelje, ki se ovijejo okoli osnovnih operacij V/I, za zmanjšanje neposrednih sistemskih klicev, ki so glede zmogljivosti dragi. Namesto da bi brali ali pisali bajt-bajt, ki bi vsakič vključeval sistemski klic, ki je naenkrat varoval V/I in zapiše večje koščke podatkov, jih predpomnilo v pomnilniške medpomnilnike.
Uporaba pufrenega V/I je ugodna, če se pogosto spopadate z majhnimi branje/piše, na primer branje vrstice po vrstici iz datoteke ali pisanje majhnih sporočil v omrežno vtičnico. Pogon nabira podatke, dokler ne doseže zmogljivosti, nato pa jih v enem sistemskem klicu izpiše. To zmanjšuje nad glavo in izboljša pretok. Poleg tega puferne operacije omogočajo metode, kot je "readline", ki učinkovito vračajo linije.
Pisanje medpomnilnika podpirajo vrste, kot so `bufio.writer`, ki odvaja, ki iznašajo in izvajajo metode, kot je` flush`, da izrecno zapišejo podatke oneficiranih podatkov, kar daje natančen nadzor nad pošiljanjem podatkov. Podobno `bufio.reader` vnos medpomnikov in podpira operacije, kot sta` Peek` in `ReadSlice`.
Optimizacija V/I na vmesniku
Go -jev paket `io` je zgrajen okoli nabora vmesnikov, kot so" bralec ",` Writer`, `Readwriter`,` ReadCloser`, `WriteCloser` in druge, ki standardizirajo vhodne/izhodne abstrakcije. Naprednejše optimizacijske strategije vključujejo izvajanje dodatnih vmesnikov, ki omogočajo neposredne prenose med bralci in pisatelji brez vmesnega medpomnilnika s funkcijo `io.copy`.
- `Writerto` vmesnik definira` Writeto (W Writer) (n int64, Err Error) `metoda, ki omogoča tipu, da svoje podatke napiše neposredno` Writer`.
- `Braedfrom` vmesnik določa metodo` readfrom (r bralnik) (n int64, err error) `, ki omogoča tipu branje podatkov neposredno iz` bralnika.
Ko te vmesnike izvaja vir (bralnik) ali cilj (pisatelj), `io.copy` te optimizirane metode uporablja za učinkovito prenos podatkov, izogibanje dodelitvi vmesnega medpomnilnika in zmanjšanje uporabe pomnilnika in kopiranje nadzemne stroške.
V pomnilniku
GO zagotavlja funkcijo `io.pipe ()`, ki vrne povezan par `pipereader` in` pipewriter`. Ta cev deluje sinhrono in v pomnilniku, kjer piše v bloku "Pipewriter", dokler se podatki ne odčitajo iz "Pipereader". Zaradi tega je močan primitiv za povezovanje kode, ki pričakuje, da je "bralnik" s kodo, ki zagotavlja "pisatelja", na primer povezovanje goroutinov za pretakanje podatkov ali verižne operacije brez vmesnega pomnilnika.
Cevi se v standardni knjižnici GO uporabljajo na primer z `OS/Exec.cmd` za povezovanje standardnih vhodnih/izhodnih tokov podprocesov, ki omogočajo prefinjene procesne cevovode.
Asinhroni V/I in goroutini
GO -jev model sočasnosti v bistvu spreminja, kako se obnašajo I/O operacije. Čeprav je API GO I/O izgledal sinhrono, goroutini v kombinaciji z Go-jevim rednim načrtovalcem izvajalcev I/O kličejo, da ne blokirajo s sistemske perspektive. Ko goroutine izvede blokiranje V/I, goroutine parkira goroutine in načrtuje druge goroutine na razpoložljivih nitjih OS. To ustvarja iluzijo asinhronih, ne-blokadnih V/I brez izrecnih vzorcev programiranja asink, kot so asink/čaka.
Ta model omogoča visoko sočasnost s preprostejšo kodo. Blokiranje I/O znotraj goroutina ne blokira celotne niti; Namesto tega je večkratna večkratna goroutina na manj navojih OS. To podpira razširljive in odzivne aplikacije, zlasti za omrežne strežnike, ki sočasno obravnavajo številne povezave.
Sodelovanje z več pisatelji in bralci
Go -jev `io.multiwriter` konstruira pisatelja, ki podvoji vse, ki pišejo na več osnovnih pisateljev, podobno kot ukaz Unix` tee`. To je koristno za beleženje, oddajanje podatkovnih tokov ali ponovitev izhoda na več destinacij hkrati. Napake pri posameznih pisateljih ustavijo celotno operacijo in zagotavljajo širjenje napak.
Na strani bralnika funkcionalnosti, kot je `io.sectionReader`, omogočajo rezanje podatkovnega toka. To omogoča branje določenih delov osnovnega "bralca", ki so uporabne pri delu z velikimi datotekami ali segmentiranimi viri podatkov.
Datoteka V/I Uspešnosti in učinkovito branje/pisanje
Datoteka V/I je mogoče optimizirati s kombiniranjem zgornjih načel. Uporabite `OS.File` za dostop do deskriptorjev datotek, nato pa ga zavijte v` bufio.reader` ali `bufio.writer` za branje in zapise. Pri branju ali pisanju velikih datotek ali naborov podatkov, v/O -o/O zmanjšuje sistemske klice in zmanjša zamude.
Iskanje podpore po metodi "Seek" (implementirano v "OS.File" in drugih) omogoča premikanje odmikanja branja/pisanja, ki je ključnega pomena za operacije I/O naključnega dostopa.
Za učinkovito branje celotne datoteke ali pretok se `io.readerl` (ker Go 1.16) bere do EOF in vrne celotno vsebino. Ta metoda v kombinaciji s puferiranim I/O uravnoteži udobje in zmogljivost.
Napredni vzorci V/I s kontekstom in odpovedjo
Medtem ko osnovne operacije V/I v GO ne podpirajo odpovedi, uvedba paketa "kontekst" ponuja mehanizem za širjenje signalov odpovedi. Številne sodobne knjižnice sprejemajo objekt "kontekst", ki omogočajo, da se V/I ali druge operacije prekličejo ali izničijo. Vključevanje konteksta z V/I je pogost vzorec v omrežnem programiranju ali dolgotrajnih operacijah, da takoj sprostite vire, ko ne potrebujejo več.
Izvedbe in razširitve po meri I/O
GO olajša ustvarjanje vrst V/I po meri z izvajanjem osnovnih vmesnikov. To je mogoče razširiti na gradnjo naprednih konstrukcij, kot so šifrirani V/I, kompresijski plasti ali omrežni protokoli. Na primer, lahko bralec po meri dešifrira podatke med muho ali pa "pisatelj" lahko stisne odhodne podatke.
Te vrste po meri lahko brezhibno sodelujejo s standardnimi knjižničnimi funkcijami, kot je `io.copy`, kar omogoča sestavo kompleksne procesne cevovode z minimalno ploščico.
Povzetek ključnih naprednih konceptov V/I v GO
- V/I s paketom `bufio` izboljšuje delovanje v pogostih majhnih branjih/zapisih.
- Optimizacije vmesnikov (`Writerto`,` Readerfrom`) omogočajo prenose podatkov z ničelno kopijo.
- Sinhrone cevi v spominu (`io.pipe`) omogočajo veriženje toka in komunikacijo sočasnosti.
-Sočasnost, ki temelji na goroutinu, med izvajanjem sinhrono kliče v/izhodne klice.
- Več-pisci in čitalniki bralnikov olajšajo napredno cepljenje in rezanje toka.
- Učinkovita datoteka V/I uporablja optimizacije, ki iščejo, iščejo in branje.
- Kontekstna integracija uvaja odpoved in nadzor nad V/I.
- Izvedbe V/I po meri zagotavljajo razširljivost za šifriranje, stiskanje in ravnanje s protokolom.