Kanava (ohjelmointi)

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ä .

Kanavien toteutukset

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ä:

libthread-kanavat

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-tapahtumat

OCaml - tapahtumamoduuli toteuttaa kirjoitetut kanavat synkronointia varten. Kun moduulin lähetys- ja vastaanottotoimintoja kutsutaan, ne generoivat vastaavat tapahtumat, jotka voidaan synkronoida.

Esimerkkejä

XMOS XC

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 ; }

Go-kieli

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 := <- c

Sovellukset

Sen 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ä]

Muistiinpanot

  1. XMOS-ohjelmointiopas (linkki ei saatavilla) . Haettu 4. elokuuta 2016. Arkistoitu alkuperäisestä 4. maaliskuuta 2016. 
  2. Tehokas Go - The Go -ohjelmointikieli . Haettu 4. elokuuta 2016. Arkistoitu alkuperäisestä 6. tammikuuta 2015.
  3. " Futures arkistoitu 4. joulukuuta 2020 Wayback Machinessa ", Go Language Patterns arkistoitu 11. marraskuuta 2020 Wayback Machinessa
  4. " Iteraattorit arkistoitu 15. lokakuuta 2020 Wayback Machinessa ", Go Language Patterns arkistoitu 11. marraskuuta 2020 Wayback Machinessa

Linkit