Edistyneisiin I/O -toimintoihin GO: ssa liittyy useita hienostuneita tekniikoita ja mekanismeja, jotka ulottuvat yksinkertaisen tiedostojen lukemisen ja kirjoittamisen ulkopuolelle. Nämä operaatioiden hyödyntämisen GO: n perustavanlaatuiset I/O-rajapinnat, sen samanaikaisuusmalli ja erityiskäyttöiset rakenteet optimaalisen suorituskyvyn ja joustavuuden saavuttamiseksi. Alla on yksityiskohtainen selitys, joka kattaa puskuroituja I/O, rajapohjaisia I/O-optimointeja, muistiputkia, asynkronista I/O-käyttäytymistä ja I/O samanaikaisia kuvioita.
puskuroitu I/O
Yksi GO: n perustavanlaatuisista edistyneistä I/O -tekniikoista on puskuroidun I/O: n käyttäminen suorituskyvyn optimoimiseksi. "Bufio` -paketti tarjoaa puskuroituja lukijoita ja kirjoittajia, jotka kiertävät I/O -perustoimintojen ympärille suorien järjestelmäpuhelujen vähentämiseksi, jotka ovat kalliita suorituskyvyn suhteen. Sen sijaan, että lukisi tai kirjoittaa tavua, johon sisältyy järjestelmäpuhelu joka kerta puskuroitu I/O lukee ja kirjoittaa suurempia tietopaloja kerralla, välimuistiin ne muistipuskureissa.
Puskuroidun I/O: n käyttäminen on edullista, kun käsitellään usein pieniä lukemia/kirjoittaa usein, kuten Reading Lead-Riv-linja tiedostosta tai kirjoittaa pieniä viestejä verkkopistorasiaan. Puskuri kerää tietoja, kunnes se saavuttaa kapasiteetin, ja huuhtelee sen sitten yhdessä järjestelmäpuhelussa. Tämä vähentää yleiskustannuksia ja parantaa suorituskykyä. Lisäksi puskuroituja toimintoja sallivat menetelmät, kuten `Readline`, mitkä palauttavat linjat tehokkaasti.
Puskuroitua kirjoitusta tukevat tyypit, kuten `bufio.writer`, joka puskuroi ja toteuttaa menetelmiä, kuten` huuhtelua`, kirjoittaaksesi puskuroidut tiedot nimenomaisesti, antaen tarkan hallinnan tietojen lähettämisen yhteydessä. Samoin `bufio.reader` puskurit syötetään ja tukee toimintoja, kuten` kurkista "ja` lukema.
Liitäntäpohjainen I/O-optimoinnit
Go: n `io` -paketti on rakennettu joukkoon rajapintoja, kuten` lukija`, `kirjoittaja`,` Readwriter`, `readCloser`,` WriteCloser`, ja muut, jotka standardoivat syöttö-/lähtö -abstraktiot. Edistyneempiin optimointistrategioihin sisältyy lisärajapintojen toteuttaminen, jotka sallivat suoran siirron lukijoiden ja kirjoittajien välillä ilman välituotteen puskurointia `io.copy` -toiminnolla.
- `Writerto` -liittymä määrittelee` WriteTo (W Writer) (n int64, ERR -virhe) `-menetelmä, jonka avulla tyyppi kirjoittaa tietonsa suoraan" kirjoittajalle ".
- `ReaderFrom` -rajapinta määrittelee` ReadFrom (R Reader) (n int64, ERR -virhe) `-menetelmä, jonka avulla tyyppi voi lukea tietoja suoraan" lukijasta ".
Kun lähde (lukija) tai kohde (kirjoittaja) toteuttaa nämä rajapinnat, `io.copy` käyttää näitä optimoituja menetelmiä tietojen siirtämiseen tehokkaasti välttäen välipuskurin allokoinnin ja vähentämällä muistin käyttöä ja kopioimalla yläpuolella.
Memory-putket
GO tarjoaa `io.pipe ()` -toiminnon, joka palauttaa kytketyn parin "pipereader" ja `pipewriter`. Tämä putki toimii synkronisesti ja muistissa, missä kirjoittaa "Pipewriter" -lohkoon, kunnes tiedot luetaan "pipereader": sta. Tämä tekee siitä tehokkaan primitiivisen koodin yhdistämiselle, joka odottaa "lukijaa" koodilla, joka tarjoaa "kirjailijan", kuten goroutiinien yhdistäminen datan suoratoistoon tai ketjuttamiseen ilman välituotteita.
Putkia käytetään sisäisesti GO: n standardikirjastossa, esimerkiksi `OS/Exec.cmd` -sovelluksen standardisyöttö-/lähtövirtojen kytkemiseen, mikä mahdollistaa hienostuneet prosessiputket.
Asynkroninen I/O ja Goroutines
Go: n samanaikaisuusmalli muuttaa pohjimmiltaan tapaa, jolla I/O -toiminnot käyttäytyvät. Vaikka GO I/O API näyttää synkronisilta, goroutiinit yhdistettynä GO: n Runtime Scheduleriin tekee I/O-puhelut estämättä järjestelmän näkökulmasta. Kun goroutiini suorittaa estämisen I/O, Go Runtime Park -puistot Goroutiinin ja aikatauluttaa muita goroutiineja käytettävissä oleviin käyttöjärjestelmien säikeisiin. Tämä luo illuusion asynkronisista, estämättömistä I/O: sta ilman nimenomaisia async-ohjelmointikuvioita, kuten async/odota.
Tämä malli mahdollistaa suuren samanaikaisuuden yksinkertaisemmalla koodilla. I/O: n estäminen goroutiinin sisällä ei estä koko lankaa; Sen sijaan Runtime -multipleksit ovat useita goroutiineja vähemmän OS -kierteillä. Tämä tukee skaalautuvia ja reagoivia sovelluksia, etenkin verkkopalvelimille, jotka käsittelevät monia yhteyksiä samanaikaisesti.
Työskentely useiden kirjoittajien ja lukijoiden kanssa
GO: n `io.multiwriter` rakentaa kirjailijan, joka kopioi kaikki kirjoittaa useille taustalla oleville kirjoittajille, samanlaisia kuin Unix` tee` -komento. Tämä on hyödyllistä tietojen kirjaamisessa, lähettämisessä tai lähdön kopioinnissa useissa kohteissa samanaikaisesti. Yksittäisten kirjoittajien virheet lopettavat yleisen toiminnan ja varmistavat virheen etenemisen.
Lukijan puolella toiminnallisuudet, kuten `io.SectionReader`, mahdollistavat tietovirran viipaloinnin. Tämä mahdollistaa tietyn osioiden lukemisen taustalla olevan "lukija", hyödyllistä, kun työskentelet suurten tiedostojen tai segmentoitujen tietolähteiden kanssa.
Tiedoston I/O -näkökohdat ja tehokas lukeminen/kirjoittaminen
Tiedosto I/O voidaan optimoida yhdistämällä yllä olevat periaatteet. Käytä `OS.File` RAW -tiedostokuvaajan käyttöoikeuksiin ja kääri sitten` bufio.reader` tai `bufio.writer` puskuroituihin lukemiin ja kirjoittamiseen. Kun luet tai kirjoitat suuria tiedostoja tai tietojoukkoja, puskuroitu I/O minimoi järjestelmäpuhelut ja vähentää viivettä.
Tuen etsiminen `Seek" -menetelmällä (toteutettu `OS.File` ja muilla) mahdollistaa lukemisen/kirjoitussiirron siirtämisen, joka on ratkaisevan tärkeää satunnaisten käyttöoikeuksien I/O -operaatioille.
Koko tiedoston tai streamin lukemiseen tehokkaasti `io.readall` (koska GO 1.16) lukee EOF: n saakka ja palauttaa koko sisällön. Yhdistettynä puskuroituun I/O: iin tämä menetelmä tasapainottaa mukavuutta ja suorituskykyä.
Advanced I/O -kuviot kontekstin ja peruutuksen kanssa
Vaikka GO: n perustoiminnot eivät tue luonnollisesti peruutusta, "konteksti" -paketin käyttöönotto tarjoaa mekanismin peruuttamissignaalien levittämiseksi. Monet nykyaikaiset kirjastot hyväksyvät "konteksti" -objektin, jonka avulla I/O tai muut operaatiot voidaan peruuttaa tai ajoittaa. Kontekstin integrointi I/O: n kanssa on yleinen kuvio verkko-ohjelmoinnissa tai pitkäaikaisissa toiminnoissa resurssien vapauttamiseksi nopeasti, kun sitä enää ei tarvita.
Custom I/O -toteutukset ja laajennukset
Go on helppo luoda mukautettuja I/O -tyyppejä toteuttamalla perusrajapinnat. Tätä voidaan laajentaa edistyneiden rakenteiden, kuten salattujen I/O, puristuskerrosten tai verkkoprotokollien, rakentamiseen. Esimerkiksi räätälöity `lukija 'saattaa purkaa tiedot lennosta tai" kirjoittaja "saattaa pakata lähteviä tietoja.
Nämä räätälöityjä tyyppejä voi olla yhteistyössä saumattomasti tavanomaisten kirjastotoimintojen, kuten `io.copy`, kanssa, mikä mahdollistaa monimutkaisten prosessointiputkien koostumuksen minimaalisella kattilalevyllä.
Yhteenveto tärkeimmistä edistyneistä I/O -käsitteistä Go
- puskuroitu I/O `bufio` -paketilla parantaa suorituskykyä usein pienissä lukemissa/kirjoittaa.
- Rajapinnan optimoinnit (`Writerto`," lukija ") salli nolla-kopion tiedonsiirrot.
- Muistin sisäiset synkroniset putket (`io.pipe`) mahdollistavat virran ketjun ja samanaikaisuuden viestinnän.
-Goroutiinipohjainen samanaikaisuus tekee synkronisista I/O-puheluista, jotka eivät ole estävää ajon aikana.
- Multi-kirjoittaja- ja osioiden lukija-apuohjelmat helpottavat edistynyttä streamin jakamista ja viipalointia.
- Tehokas tiedosto I/O käyttää puskurointia, etsimistä ja optimointien lukemista.
- Konteksti -integrointi tuo peruuttaa ja aikakatkaisun I/O: n suhteen.
- Mukautetut I/O -toteutukset tarjoavat laajennettavuuden salaukseen, pakkaamiseen ja protokollan käsittelyyn.