Kanava on malli prosessien väliselle kommunikaatiolle ja synkronoinnille ohjelmoinnin viestien kautta . Viestejä voidaan lähettää kanavan kautta, ja toinen prosessi tai säie, jolla on linkki kanavaan, voi vastaanottaa kanavan kautta lähetettyjen viestien virran suorana . Kanavien eri toteutukset voivat olla synkronisia tai asynkronisia, käyttää viestipuskurointia tai ei.
Kanavat ovat perustavanlaatuisia prosessilaskennan lähestymistavalle , ja ne ovat peräisin Cooperating Sequential Processes (CSP), muodollisesta samanaikaisuuden mallista. Kanavia käytetään monissa johdetuissa ohjelmointikielissä, kuten Occam , Limbo ( Newsqueak- ja Aleph -kielten kautta ). Niitä käytetään myös Plan 9 -käyttöjärjestelmän C-ohjelmointikielen libthread -ketjutuskirjastossa sekä Stackless Pythonissa ja Go-kielessä .
Kanavat, jotka on luotu samalla tavalla kuin CSP-malli, ovat synkronisia : prosessi, joka odottaa kohteen vastaanottamista kanavalta, estää objektin lähettämisen. Tällaisia toteutuksia kutsutaan "rendezvousiksi". Tyypilliset tällaisten putkien toiminnot on esitetty käyttämällä esimerkkinä libthread-kanavaliitäntöjä:
Alun perin Plan 9 -käyttöjärjestelmää varten luotu libthread - ketjutuskirjasto tarjoaa säikeiden välisiä viestintäominaisuuksia kiinteän kokoisten putkien kautta.
OCaml - tapahtumamoduuli toteuttaa kirjoitetut kanavat synkronointia varten. Kun moduulin lähetys- ja vastaanottotoimintoja kutsutaan, ne generoivat vastaavat tapahtumat, jotka voidaan synkronoida.
XMOS : ssa XC-kieli tarjoaa sisäänrakennetun tyypin "chan" ja kaksi operaattoria "<:" ja ":>" tietojen lähettämiseen ja vastaanottamiseen kanavasta. [yksi]
Esimerkki aloittaa kaksi laitteistosäiettä XMOS:ssa ja suorittaa kaksi riviä "par"-lohkosta. Ensimmäinen rivi lähettää numeron 42 putken läpi. Toinen rivi odottaa arvon vastaanottamista kanavalta ja kirjoittaa vastaanotetun arvon x-muuttujaan. XC-kieli tukee myös asynkronista vastaanottoa kanavilta select-lauseen avulla.
chan c ; int x ; par { c <: 42 ; c :> x ; }Tämä Go-koodin pala luo ensin kanavan c, sitten synnyttää gorutiinin, joka lähettää 42 kanavan läpi. Kun numero lähetetään kanavalle, x:n arvoksi tulee 42. Go sallii kanavien puskuroida sisältöä. Ei-estoinen vastaanottotoiminto kanavalta on mahdollista valintalohkon avulla. [2]
c := tee ( chan int ) go func () { c <- 42 }() x := <- cSen lisäksi, että kanavia käytetään säikeiden väliseen viestintään, niitä voidaan käyttää primitiivinä toteuttamaan muita samanaikaisia rakenteita. Esimerkiksi kanavien avulla voit toteuttaa futuureja ja lupauksia , joissa tulevaisuus on yksittäinen kanava ja lupaus on prosessi, joka lähettää kanavalle ja toteuttaa tulevaisuuden. [3] Samoin iteraattorit voidaan toteuttaa putkien kautta. [neljä]