Progettazione dell'API: oggetti stream vs funzioni e messaggi

7

Sto progettando API per una libreria python che accetta input asincroni e produce l'output asincrono: vari segnali entrano e vari segnali vengono generati in risposta (non c'è una relazione uno-a-uno tra i segnali input e output).

L'input potrebbe provenire da un input utente di rete / file / interattivo (basato sul terminale); o da una funzione di visualizzazione del framework web. Allo stesso modo, l'output potrebbe dover essere inviato a un socket / file / schermo o restituito a un chiamante (in quest'ultimo caso, dovrebbe essere memorizzato nel buffer e tutto l'output accumulato dall'ultima chiamata deve essere restituita). La scelta tra diversi canali I / O viene effettuata una volta all'inizio e non viene modificata mentre il programma è in esecuzione.

Suppongo che il livello I / O utilizzi più thread o processi o sia asincrono. E chiama le mie funzioni di libreria.

Quali sono i pro / contro di accettare come argomenti due oggetti stream (per input e output); esporre le funzioni che devono essere richiamate quando un input è disponibile o l'output è desiderato; usare i messaggi per comunicare? O forse qualche altro approccio è migliore?

    
posta max 17.11.2016 - 09:51
fonte

1 risposta

2

In breve:

  • messaggi : un paradigma semplice, e spesso il più facile da interfacciare, specialmente se si desidera targetizzare un ampio intervallo di i / o (tcp, http, terminale ...) . Nella maggior parte dei casi, hai un livello intermedio indipendente per memorizzare nella cache e gestire i flussi di i / o.

  • funzioni : bene, è perfetto per le librerie utilizzate nella stessa lingua. Ma se vuoi interfacciarlo ad un livello superiore, avrai comunque bisogno di un wrapper attorno.

  • stream : accettare gli stream direttamente nella lib è simile ai messaggi ma presenta uno svantaggio. Principalmente, tutto ciò che riguarda ciò che può andare storto con i flussi (disconnessi, timeout, errori ...) tende a finire come gestione delle eccezioni nella "logica aziendale" anziché in un livello separato.

IMHO, non la vedrei come una "questa o quella" domanda. Piuttosto potrebbe essere interessante guardarlo da questa prospettiva:

streams are used to transmit messages which are the result of function calls

    
risposta data 23.03.2018 - 16:59
fonte