Use non-blocking writes when sending data frames.
Always create non-existent pipes. Tidy code, separating out initialisation code from building connections and sending/receiving data.
Show context of a parse error in exception message.
Only test read/write state in select() calls, not exceptional conditions (writing to stdout.fileno() when stdout is redirected to a file generates a flood of exceptional conditions...).
Use 'multiprocessing' as prefix when referencing members of its package.
Opening an output pipe as non-blocking write-only generates an error if no one is waiting to read the pipe, so open it as read/write.
Try to synchronise multiple output streams by waiting for them all to have data ready before starting output.
Tidy up debugging.
When creating a pipe we need to separate out the test for existing directories from that for an existing pipe.
Return any parse error message as the result of 'stream_data()'.
Connection definitions can come from the command line, a file, or standard input -- add help text and parse command line.
Some very initial documentation notes.
Look for 'label' and 'desc' options.
"None' is default value for a dictionary get(), so don't explicitly state this.
Allow unit specifications to be in quotes.
Pass 'label' and 'description' properties when creating recordings and signals.