A csatorna a folyamatok közötti kommunikáció és szinkronizálás modellje az üzenettovábbításon keresztül a programozásban. Üzenetek küldhetők egy csatornán keresztül, és egy másik folyamat vagy szál, amely a csatornára hivatkozik , fogadhatja a csatornán keresztül küldött üzenetfolyamot adatfolyamként . A csatornák különböző megvalósításai lehetnek szinkronok vagy aszinkronok, használhatnak üzenetpufferelést vagy sem.
A csatornák alapvetőek a folyamatszámítási megközelítésben, és a Cooperating Sequential Processes (CSP), a párhuzamosság formális modelljéből származnak . A csatornákat számos származtatott programozási nyelvben használják, mint például az Occam , Limbo (a Newsqueak és Aleph nyelveken keresztül ). A C programozási nyelv libthread szálfűzési könyvtárában is használatosak a Plan 9 operációs rendszerben , valamint a Stackless Pythonban és a Go nyelvben .
A CSP-modellhez hasonlóan létrehozott csatornák szinkronok : egy folyamat, amely egy objektum fogadására vár egy csatornától, az objektum elküldéséig blokkol. Az ilyen megvalósításokat "rendezvous"-nak nevezik. Az ilyen csövekkel végzett tipikus műveleteket a libthread csatorna interfészek segítségével mutatjuk be példaként:
Az eredetileg a Plan 9 operációs rendszerhez létrehozott libthread szálfűzési könyvtár szálak közötti kommunikációt kínál rögzített méretű csöveken keresztül.
Az OCaml eseménymodul típusos csatornákat valósít meg a szinkronizáláshoz. A modul küldési és fogadási funkcióinak meghívásakor a megfelelő eseményeket generálják, amelyek szinkronizálhatók.
Az XMOS -ban az XC nyelv egy beépített "chan" típust és két "<:" és ":>" operátort biztosít az adatok küldéséhez és fogadásához egy csatornáról. [egy]
A példa két hardverszálat indít az XMOS-ban, és két sort hajt végre a "par" blokkból. Az első sor a 42-es számot küldi a csövön keresztül. A második sor vár egy értéket a csatornától, és a kapott értéket az x változóba írja. Az XC nyelv támogatja az aszinkron vételt is a csatornákról a select utasítás használatával.
chan c ; int x ; par { c <: 42 ; c :> x ; }Ez a Go kódrészlet először létrehozza a c csatornát, majd létrehoz egy gorutint, amely 42-t küld a csatornán keresztül. Ha számot küld egy csatornának, az x értéke 42 lesz. A Go lehetővé teszi a csatornák számára, hogy puffereljenek tartalmat. Egy csatorna nem blokkoló vételi művelete lehetséges kiválasztási blokk segítségével. [2]
c := make ( chan int ) go func () { c <- 42 }() x := <- cA szálak közötti kommunikáción túlmenően a csatornák primitívként is használhatók más párhuzamos konstrukciók megvalósítására. Például a csatornák lehetővé teszik a határidők és ígéretek megvalósítását , ahol a jövő egy egyedi csatorna, az ígéret pedig egy folyamat, amely a csatornához küldi a jövőt. [3] Hasonlóképpen, az iterátorok csöveken keresztül is megvalósíthatók. [négy]