Täpsemad I/O -toimingud GO -s hõlmavad mitmeid keerukaid tehnikaid ja mehhanisme, mis ulatuvad kaugemale lihtsast failide lugemisest ja kirjutamisest. Need toimingud võimendavad GO põhilisi I/O liideseid, selle samaaegsuse mudelit ja eriotstarbelisi konstruktsioone optimaalse jõudluse ja paindlikkuse tagamiseks. Allpool on üksikasjalik seletus, mis hõlmab puhverdatud I/O, liidesepõhiseid I/O optimeerimisi, mälusiseseid torusid, asünkroonset I/O käitumist ja I/O samaaegsuse mustritega.
Puhverdatud I/O
Üks GO -i alustala -arenenud I/O tehnikaid on jõudluse optimeerimiseks puhverdatud I/O kasutamine. Pakett `bufio` pakub puhverdatud lugejatele ja kirjanikele, kes ümbritsevad põhilisi I/O -toiminguid, et vähendada otseseid süsteemikõnesid, mis on jõudluse osas kulukad. Selle asemel, et lugeda või kirjutada baiti-bait, mis hõlmaks süsteemikõnet iga kord, kui puhverdab I/O, loeb ja kirjutab korraga suuremaid andmeid, vahemällu salvestades mälupuhvrites.
Puhverdatud I/O kasutamine on soodne väikeste lugemiste/kirjutamisega tegelemisel, näiteks failist rea lugemine või väikeste sõnumite kirjutamine võrgu pistikupesasse. Puhver koguneb andmed, kuni need jõuab mahutavusega, seejärel loputab need ühes süsteemikõnes. See vähendab üldkulusid ja parandab läbilaskevõimet. Lisaks võimaldavad puhverdatud toimingud selliseid meetodeid nagu "Readline", mis tagastavad read tõhusalt.
Puhverdatud kirjutamist toetavad sellised tüübid nagu `bufio.writer`, mis puhverdab välja ja rakendab puhverdatud andmete selgesõnalise kirjutamise meetodeid ja rakendab selliseid meetodeid, andes täpse kontrolli andmete saatmise üle. Sarnaselt sisestab `bufio.reader` puhvrid ja toetab toiminguid nagu" Peek "ja" Readslice ".
Liidesepõhised I/O optimeerimised
Go `io` pakett on ehitatud selliste liideste komplekti ümber nagu` Reader`, `Writer`,` Readwriter`, `ReadCloser`,` WriteCloser` ja teised, kes standardiseerivad sisend-/väljund abstraktsioone. Täiustatud optimeerimisstrateegiad hõlmavad täiendavate liideste rakendamist, mis võimaldavad lugejate ja kirjanike vahelist otseülekannet ilma funktsiooni `io.Copy` abil vahepealse puhverdamiseta.
- `Writerto` -liides määratleb` Writeto (W Writer) (n int64, viga viga) `meetodi, mis võimaldab tüübil oma andmeid kirjutada otse kirjanikule.
- `ReaderFrom'i liides määratleb lugemise (r lugeja) (n int64, viga)` meetodi, mis võimaldab tüübil lugeda andmeid otse lugejalt.
Kui neid liideseid rakendab allikas (lugeja) või sihtkoht (kirjanik), kasutab `io.Copy` neid optimeeritud meetodeid andmete tõhusaks edastamiseks, vältides puhvri vahepealset jaotust ning vähendades mälu kasutamist ja kopeerimist pea kohal.
mälusisesed torud
GO pakub funktsiooni `io.pipe ()`, mis tagastab ühendatud paari PipeReader ja `pipewriter`. See toru töötab sünkroonselt ja mälus, kus kirjutab plokile "torusti", kuni andmed loetakse "PipeReaderist". See muudab selle võimas primitiivseks koodi ühendamiseks, oodates lugejat koodiga, mis pakub kirjanikku, näiteks goroutiinide ühendamine andmete voogesitamiseks või aheldamistoiminguteks ilma keskmise salvestuseta.
Torusid kasutatakse sisemiselt GO standardses teegis, näiteks alamprotsesside standardsete sisend-/väljundvoogude ühendamiseks, võimaldades keerukaid protsessitorustikke.
asünkroonsed I/O ja goroutiinid
Go samaaegsuse mudel muudab põhimõtteliselt seda, kuidas I/O -toimingud käituvad. Kuigi Go I/O API näeb välja sünkroonne, muudavad goroutiinid koos Go käitusajakavaga I/O-kõned mitte blokeerima süsteemi vaatenurgast. Kui goroutine teostab I/O blokeerimist, parkib Go Runtime Goroutine ja ajastab muid Goroutiine saadaolevatel OS -i lõimedel. See loob illusiooni asünkroonsest, mitte blokeerivast I/O-st ilma selgesõnaliste asünc programmeerimismustriteta, näiteks async/oota.
See mudel võimaldab lihtsama koodiga kõrge samaaegsust. I/O blokeerimine goroutiini sees ei blokeeri kogu niidi; Selle asemel multipleksid multipleksid mitu goroutiini vähem OS -i lõimedel. See toetab skaleeritavaid ja reageerivaid rakendusi, eriti paljude ühendusi käsitlevate võrguserverite jaoks.
Töö mitme kirjaniku ja lugejatega
Go `io.multiWriter` konstrueerib kirjaniku, kes dubleerib kõik kirjutatud kirjutajatele, sarnaselt käsu Unix` tee`. See on kasulik logimiseks, andmevoogude levitamiseks või väljundi reprodutseerimiseks mitmetes sihtkohtades üheaegselt. Üksikute kirjanike vead peatavad üldise töö, tagades vea leviku.
Lugeja poolel võimaldavad funktsionaalsused nagu `io.SectionReader` andmevoo viilutamine. See võimaldab lugeda aluseks oleva "lugeja" konkreetseid osi, mis on kasulik suurte failide või segmenteeritud andmeallikatega töötamisel.
Faili I/O kaalutlused ja tõhus lugemine/kirjutamine
Faili I/O saab optimeerida, ühendades ülaltoodud põhimõtted. Kasutage toorefailide kirjelduse juurdepääsu saamiseks `OS.File ', seejärel mähkige see puhverdatud lugemiste ja kirjutamise jaoks` bufio.reader` või `bufio.writer'. Suurte failide või andmekogumite lugemisel või kirjutamisel minimeerib puhver I/O süsteemikõnesid ja vähendab latentsusaega.
Tugi otsimine meetodi otsimise kaudu (rakendatud jaotises "OS.File" ja teised) võimaldab lugemis-/kirjutamise nihke liigutada, mis on juhuslik Juhusliku juurdepääsu I/O -toimingute jaoks.
Terve faili või voogesituse tõhusaks lugemiseks loeb `io.readall` (kuna GO 1.16) loeb kuni EOF ja tagastab kogu sisu. Kombineerituna puhverdatud I/O -ga tasakaalustab see meetod mugavust ja jõudlust.
Täiustatud I/O mustrid konteksti ja tühistamisega
Kuigi põhilised I/O -toimingud ei toeta GO -d tühistamist, pakub paketi „konteksti” kasutuselevõtt mehhanismi tühistamissignaalide levitamiseks. Paljud kaasaegsed raamatukogud aktsepteerivad konteksti objekti, mis võimaldab I/O või muid toiminguid tühistada või ajastada. Konteksti integreerimine I/O-ga on võrguprogrammeerimise või pikaajaliste toimingute tavaline muster, et ressursse viivitamatult välja anda, kui seda enam vaja pole.
Kohandatud I/O rakendused ja laiendused
GO muudab põhiliideste rakendamise kaudu kohandatud I/O tüüpide loomise lihtsaks. Seda saab laiendada täiustatud konstruktsioonide, näiteks krüptitud I/O, tihenduskihi või võrguprotokollide ehitamisele. Näiteks võib kohandatud lugeja dekrüpteerida andmed lennult või võib väljaminevate andmeid tihendada.
Need kohandatud tüübid saavad sujuvalt koostalitlusväärselt koostada standardseid raamatukogu funktsioone nagu "io.copy", mis võimaldab keerukate töötlemisjuhtmete koostist minimaalse katlaplaadiga.
KOKKU KOKKU KOKKUVÕTE I/O kontseptsioonidest GO -s
- Puhverdatud I/O koos `Bufio` paketiga parandab jõudlust sagedastes väikestes lugemisviisides/kirjutistes.
- Liidese optimeerimised (`Writerto`,` ReaderFrom ') võimaldavad null-koopia andmete edastamist.
- mälusisesed sünkroonsed torud (`io.pipe`) võimaldavad voolu aheldamist ja samaaegset suhtlust.
-Goroutiinil põhinev samaaegsus muudab sünkroonsed I/O-kõned käivitamisel mitte blokeerivaks.
- Mitme kirjaniku ja sektsioonilugeja utiliidid hõlbustavad voogu täpsemat jagamist ja viilutamist.
- Tõhus fail I/O kasutab puhverdamist, otsimist ja lugemist optimeerimisi.
- Konteksti integreerimine tutvustab Tühistamise ja aegumistöö kontrolli I/O üle.
- Kohandatud I/O -rakendused pakuvad krüptimise, tihendamise ja protokollide käitlemise laiendatavust.