Class: PRuby::Pipeline Abstract
Overview
Un pipeline est compose d'une suite de noeuds (aka. "nodes", "stages", etages) connectes entre eux. Un pipeline possede un canal d'entree et un canal de sortie. On peut lancer l'execution d'un pipeline (avec run) puis attendre qu'il se termine (avec join). On peut aussi connaitre la/les valeur/s finale/s retournee/s par son/ses threads associes (avec value).
Un Pipeline est en fait une classe purement abstraite, puisque chaque noeud d'un Pipeline est aussi une instance d'une sous-classe de Pipeline. Il s'agit donc d'un cas typique du patron "composite", illustre par le diagramme de classes ci-joint.
___________________
| | 1..*
| Pipeline |/___________________________
|_________________|\ |
/\ |
---- |
| |
| |
|--------------------|---------------------| |
| | | |
________|__________ ________|__________ ________|__________ |
| | | | | | |
| ProcNode | | PipelineNode | | FarmNode | |
|_________________| |_________________| |_________________| |
| | |
|--------------------|---------------
Direct Known Subclasses
Instance Attribute Summary collapse
-
#input_channel ⇒ Channel
(also: #input)
abstract
Le canal d'entree.
-
#output_channel ⇒ Channel
(also: #output)
abstract
Le canal de sortie.
Class Method Summary collapse
-
.create(*args) ⇒ Pipeline
Cree un pipeline.
-
.sink(sink) ⇒ Pipeline
Cree un puits pour un pipeline.
-
.source(source, source_kind = nil) ⇒ Pipeline
Cree une source pour un pipeline.
Instance Method Summary collapse
-
#>>(other) ⇒ self
Connecte une source a un pipeline ou un pipeline a un puits.
-
#input_channel_connected? ⇒ Bool
Determine si le canal d'entree du pipeline est connecte.
-
#join ⇒ self
Bloque jusqu'a ce que l'execution du/des noeud/s soit terminee.
-
#output_channel_connected? ⇒ Bool
Determine si le canal de sortie du pipeline est connecte.
-
#run(no_wait = nil) ⇒ self
Lance un/des thread/s pour executer la/les tache/s associee/s au/x noeud/s.
-
#sink? ⇒ Bool
Determine si le noeud est un puits, donc qui n'emet rien sur le canal de sortie.
-
#source? ⇒ Bool
Determine si le noeud est une source, donc qui ne recoit rien du canal d'entree.
-
#terminated? ⇒ Bool
Indique si le thread associe au pipeline a termine son execution.
-
#wrap_around! ⇒ self
Cree un lien de feedback, avec un nouveau canal, entre la sortie et l'entree du pipeline.
-
#|(other) ⇒ self
Connecte deux pipelines entre eux.
Instance Attribute Details
#input_channel ⇒ Channel Also known as: input
Le canal d'entree
75 76 77 |
# File 'lib/pruby/pipeline.rb', line 75 def input_channel fail "*** La methode input_channel doit etre redefinie dans une sous-classe" end |
#output_channel ⇒ Channel Also known as: output
Le canal de sortie
84 85 86 |
# File 'lib/pruby/pipeline.rb', line 84 def output_channel fail "*** La methode output_channel doit etre redefinie dans une sous-classe" end |
Class Method Details
.create(*args) ⇒ Pipeline
Cree un pipeline. Simple operation de facade.
55 56 57 |
# File 'lib/pruby/pipeline.rb', line 55 def self.create( *args ) PipelineFactory.pipeline *args end |
.sink(sink) ⇒ Pipeline
Cree un puits pour un pipeline. Simple operation de facade.
66 67 68 |
# File 'lib/pruby/pipeline.rb', line 66 def self.sink( sink ) PipelineFactory.sink sink end |
.source(source, source_kind = nil) ⇒ Pipeline
Cree une source pour un pipeline. Simple operation de facade.
44 45 46 |
# File 'lib/pruby/pipeline.rb', line 44 def self.source( source, source_kind = nil ) PipelineFactory.source source, source_kind end |
Instance Method Details
#>>(other) ⇒ self
Identique a |. Utilise simplement parce que plus “image”
Attention: la priorite de “>>” differe de celle de “|” !?!?
Connecte une source a un pipeline ou un pipeline a un puits.
147 148 149 150 151 |
# File 'lib/pruby/pipeline.rb', line 147 def >>( other ) DBC.require( source? || other.class == Proc || other.sink?, "*** Cette operation ne peut etre utilisee qu'avec une source (a gauche) ou un sink (a droite)" ) add_stage( other ) end |
#input_channel_connected? ⇒ Bool
Determine si le canal d'entree du pipeline est connecte.
105 106 107 |
# File 'lib/pruby/pipeline.rb', line 105 def input_channel_connected? input_channel end |
#join ⇒ self
Bloque jusqu'a ce que l'execution du/des noeud/s soit terminee. Si deja termine, alors NOOP.
203 204 205 206 207 208 209 210 |
# File 'lib/pruby/pipeline.rb', line 203 def join return if terminated? inner_nodes.map(&:join) @terminated = true self end |
#output_channel_connected? ⇒ Bool
Determine si le canal de sortie du pipeline est connecte.
112 113 114 |
# File 'lib/pruby/pipeline.rb', line 112 def output_channel_connected? output_channel end |
#run(no_wait = nil) ⇒ self
Lance un/des thread/s pour executer la/les tache/s associee/s au/x noeud/s. Donc, s'il s'agit d'un noeud composite, alors lance l'execution des noeuds internes.
188 189 190 191 192 193 194 195 |
# File 'lib/pruby/pipeline.rb', line 188 def run( no_wait = nil ) @terminated = false inner_nodes.map { |s| s.run :NO_WAIT } join unless no_wait == :NO_WAIT self end |
#sink? ⇒ Bool
Determine si le noeud est un puits, donc qui n'emet rien sur le canal de sortie.
126 127 128 |
# File 'lib/pruby/pipeline.rb', line 126 def sink? @source_ou_sink == :sink end |
#source? ⇒ Bool
Determine si le noeud est une source, donc qui ne recoit rien du canal d'entree.
119 120 121 |
# File 'lib/pruby/pipeline.rb', line 119 def source? @source_ou_sink == :source end |
#terminated? ⇒ Bool
Indique si le thread associe au pipeline a termine son execution
156 157 158 |
# File 'lib/pruby/pipeline.rb', line 156 def terminated? @terminated end |
#wrap_around! ⇒ self
Cree un lien de feedback, avec un nouveau canal, entre la sortie et l'entree du pipeline
168 169 170 171 172 173 174 175 176 |
# File 'lib/pruby/pipeline.rb', line 168 def wrap_around! DBC.require !input_channel_connected?, "*** L'entree du pipeline est deja connectee" DBC.require !output_channel_connected?, "*** La sortie du pipeline est deja connectee" chan = Channel.new self.output_channel = chan self.input_channel = chan self end |
#|(other) ⇒ self
Connecte deux pipelines entre eux.
136 137 138 |
# File 'lib/pruby/pipeline.rb', line 136 def |( other ) add_stage( other ) end |