Teknologian jakaminen

Go language --- samanaikainen ohjelmointikanava (kaksikanavainen, yksikanavainen) ja sovellusesimerkkejä (tuottajakuluttaja, tulostinmalli)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

kanava

Gorutiinit toimivat samassa osoitetilassa, joten pääsy jaettuun muistiin on synkronoitava.Gorutiinit jakavat muistia kommunikoinnin kautta muistin jakamisen sijaan.

Viitetyyppinen kanava on CSP-tilan erityinen toteutus, ja sitä käytetään useaan goritiiniviestintään. Se toteuttaa synkronoinnin sisäisesti varmistaakseen samanaikaisuuden turvallisuuden.

kanavan tyyppi

Kuten kartta, kanava on myös viittaus taustalla olevaan datarakenteeseen, jonka make luo.
Kun kopioimme kanavan tai käytämme sitä funktioparametrien välittämiseen, kopioimme vain kanavaviittauksen, joten kutsuja ja kutsuttava viittaavat samaan kanavaobjektiin. Kuten muutkin viitetyypit, kanavan nolla-arvo on nolla.
Kun määrität kanavaa, sinun on myös määritettävä kanavalle lähetettävien arvojen tyyppi. Kanavia voidaan luoda käyttämällä sisäänrakennettua make()-funktiota:

make (chan Type)
make (chan Type,capacity)
  • 1
  • 2
  • Kun kapasiteetti = 0, kanava on puskuroitu ja estää lukemisen ja kirjoittamisen.
  • Chamnel vastaanottaa ja lähettää tietoja operaattorin <- kautta Datan lähettämisen ja vastaanottamisen syntaksi on:
channel<-value   //发送value 到channel
<-channel     //接收并将其丢弃
x:=<-channel   //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel   //功能同上,同时检查通道是否已关闭或者是否为空
  • 1
  • 2
  • 3
  • 4

Oletusarvoisesti kanava estää tietojen vastaanottamisen ja lähettämisen, ellei toinen pää ole valmis, mikä tekee gorutiinin synkronoinnista yksinkertaisempaa ilman erityisiä lukituksia.

saavuttaa

Lisää kuvan kuvaus tähän

  • Putket sijoitetaan yksi painatuksen eteen ja yksi painatuksen taakse.
  • Jos Person2 suoritetaan ensin eikä liukuhihnassa ole dataa, se estetään.
  • Person1 suorittaa ja tulostamisen jälkeen syöttää tiedot putkeen Person2 tunnistaa sen ja alkaa tulostaa.

Toteuta synkronointi ja datavuorovaikutus kanavien kautta

Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän

puskuroimaton kanava

Puskuroimaton kanava on kanava, jolla ei ole kykyä tallentaa arvoa ennen vastaanottamista.
Tämäntyyppinen kanava edellyttää, että lähetysgorutiini ja vastaanottogorutiini ovat valmiita samanaikaisesti suorittamaan lähetys- ja vastaanottotoiminnot. Jos kaksi gorutiinia ei ole valmiina samanaikaisesti, kanava saa kanavan, joka suorittaa ensin lähetys- tai vastaanottotoiminnon, estämään ja odottamaan.
Tämä kanavalle lähettämisen ja vastaanottamisen vuorovaikutus on luonnostaan ​​synkronista. Mikään operaatio ei voi olla olemassa toisesta riippumatta.
Seuraava kuva näyttää, kuinka kaksi goritiinia voivat jakaa arvon puskuroimattomia kanavia käyttämällä:
Lisää kuvan kuvaus tähän

  • Eli itse kanava ei voi tallentaa asioita, jos laitat jotain yhteen, voit ottaa sen heti pois.
  • Vaiheessa 1 molemmat gorutiinit saapuvat kanavalle, mutta kumpikaan ei aloita lähettämistä tai vastaanottamista.
  • Vaiheessa 2 vasemmanpuoleinen gorutiini ojentaa kätensä kanavaan, mikä simuloi tiedon lähettämistä kanavalle. Tällä hetkellä gorutiini on lukittu kanavaan, kunnes vaihto on valmis.
  • Vaiheessa 3 oikealla oleva gorutiini laittaa kätensä kanavaan, mikä simuloi tiedon vastaanottamista kanavalta. Tämä goutiini on myös lukittu kanavaan, kunnes vaihto on valmis.
  • Vaiheissa 4 ja 5 tapahtuu vaihto, ja lopuksi vaiheessa 6 molemmat goritiinit nostavat kätensä pois kanavasta, mikä simuloi lukitun gorutiinin vapautumista. Molemmat gorotiinit voivat nyt tehdä muita asioita.

Luo puskuroimaton kanava

make (chan Type)//等价于make (chan Type,0)
  • 1

Jos puskurin kokoa ei ole määritetty, kanava on synkroninen ja siksi estetään, kunnes lähettäjä on valmis lähettämään ja vastaanottaja on valmis vastaanottamaan.

Lisää kuvan kuvaus tähän

  • ch&lt;-i kirjoittaa tiedot kanavalle, ja pääkorutiini ei suorita ennen kuin se havaitsee .
  • Println kuitenkin tulostaa tiedot putken lukemisen jälkeen, joten tulostusnopeuden määrää järjestelmä.

puskuroitu kanava

Puskuroitu kanava on kanava, joka voi tallentaa yhden tai useamman arvon ennen sen vastaanottamista.
Tämäntyyppinen kanava ei edellytä, että gorutiinin on suoritettava lähetys ja vastaanotto samanaikaisesti. Kanavilla on myös erilaisia ​​ehtoja, jotka estävät lähetys- ja vastaanottotoiminnot. Vastaanottotoiminto estyy vain, jos kanavalla ei ole vastaanottavaa arvoa. Lähetystoiminto estetään vain, jos kanavalla ei ole käytettävissä puskuria lähetettävän arvon vastaanottamiseksi.
Tämä johtaa suureen eroon puskuroitujen ja puskuroimattomien kanavien välillä: puskuroimattomat kanavat takaavat, että lähetys- ja vastaanottamisgorutiinit vaihtavat tietoja samanaikaisesti: puskuroiduilla kanavilla ei ole tällaista takuuta.
Lisää kuvan kuvaus tähän

  • Vaiheessa 1 oikealla oleva goritiini vastaanottaa arvon kanavalta.
  • Vaiheessa 2 oikealla oleva gorutiini suorittaa arvon vastaanottamisen itsenäisesti, kun taas vasemmanpuoleinen goritiini lähettää uuden arvon kanavalle.
  • Vaiheessa 3 vasemmanpuoleinen gorutiini lähettää edelleen uutta arvoa kanavalle, kun taas oikealla oleva goritiini vastaanottaa toista arvoa kanavalta. Tämän vaiheen kaksi toimintoa eivät ole synkronoituja eivätkä estä toisiaan.
  • Lopuksi vaiheessa 4 kaikki lähetys ja vastaanotto on suoritettu, ja kanavassa on vielä muutama arvo ja tilaa lisäarvojen tallentamiseen.

luoda

make (chan Type,capacity)
  • 1

Jos puskurikapasiteetti annetaan, kanava on asynkroninen. Niin kauan kuin puskurissa on käyttämätöntä tilaa tiedon lähettämiseen tai se sisältää dataa, joka voidaan vastaanottaa, viestintä etenee ilman estoa.

saavuttaa

Lisää kuvan kuvaus tähän

  • Jos kolmea on tallennettu tarpeeksi, se lukittuu ja odottaa lukemista Kun pääkorutiini on lukenut osan datasta ja siellä on vapaata tilaa, alikorutiini jatkaa suoritusta, eikä seuraava tulostusjärjestys ole varma.
    Lisää kuvan kuvaus tähän

sulje kanava

Kanava voi havaita ok-painikkeella, onko kanava edelleen auki. Jos kanava on suljettu, tietoja ei lueta.

Lisää kuvan kuvaus tähän

  • num ,ok:=<-chVoi havaita, onko kanava suljettu.

Ilmoitus

  • Kanavia ei tarvitse sulkea yhtä usein kuin tiedostoja. Sulje kanava vain, kun sinulla ei todellakaan ole lähetettävää dataa tai jos haluat nimenomaisesti lopettaa aluesilmukan tai vastaavan.
  • Kanavan sulkemisen jälkeen kanavalle ei voi lähettää enempää dataa (paniikkivirhe laukeaa, jolloin vastaanotto palauttaa välittömästi nolla-arvon):
  • Kanavan sulkemisen jälkeen voit jatkaa tietojen vastaanottamista chamnelista:
  • Nollakanavalla sekä lähetys että vastaanotto estetään.
    Lisää kuvan kuvaus tähän
  • Voit käyttää aluetta kulkeaksesi kanavan läpi ja hypätäksesi automaattisesti ulos silmukasta
    Lisää kuvan kuvaus tähän

Yksisuuntainen kanava

Kanava on oletusarvoisesti kaksoiskysymys, eli voit lähettää siihen dataa ja vastaanottaa sieltä dataa.
Näemme kuitenkin usein parametrina välitetyn kanavan ja arvoa oletetaan käytettävän yhteen suuntaan, joko vain tiedon lähettämiseen tai vain tiedon vastaanottamiseen. Tällä hetkellä voimme määrittää kanavan suunnan. Yksisuuntaisen kamelimuuttujan ilmoitus on hyvin yksinkertainen, seuraavasti:

var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int  //ch3单向,只能用于读int数据
  • 1
  • 2
  • 3

chan&lt;- tarkoittaa, että data tulee putkeen ja tiedot kirjoitetaan putkeen, joka lähetetään soittajalle.
&lt;-chan ilmaisee, että data tulee putkesta Soittajalle saadaan data putkesta, joka on tietysti syöte.
Kanava voidaan implisiittisesti muuntaa yksisuuntaiseksi jonoksi, vain vastaanottavaksi tai vain lähettäväksi, mutta yksisuuntaista kanavaa ei voida muuntaa normaaliksi kanavaksi;

Lisää kuvan kuvaus tähän

Hyödynnä yhtä kanavaa tuottaja-kuluttaja-mallin toteuttamiseen

Lisää kuvan kuvaus tähän