Sono in procinto di eseguire il wrapping di una libreria C per alcune codifiche in un'interfaccia pipe, ma ho trovato alcune decisioni di progettazione che devono essere prese.Considerazioni sulla concorrenza tra i tubi e codice non-pipe
Dopo aver impostato la libreria C, manteniamo un contesto encoder. Con questo, possiamo o codificare, o modificare alcuni parametri (chiamiamo l'interfaccia Haskell a quest'ultima funzione tune :: Context -> Int -> IO()
). Ci sono due parti alla mia domanda:
- La parte di codifica è facilmente avvolto in un
Pipe Foo Bar IO()
, ma vorrei anche per esporretune
. Poiché l'uso simultaneo del contesto di codifica deve essere protetto da blocco, è necessario prendere un blocco ad ogni iterazione nel tubo e proteggeretune
con lo stesso blocco. Ma ora sento che sto forzando chiusure nascoste sull'utente. Sto abbaiando sull'albero sbagliato qui? Come si risolve questo tipo di situazione nell'ecosistema dei tubi? In il mio caso mi aspetto che la pipa di cui fa parte il mio codice specifico esegua sempre il proprio thread, con il tuning che si verifica contemporaneamente, ma non voglio forzare questo punto di vista su nessun utente. Altri pacchetti nell'ecosistema dei tubi non sembrano forzare i loro utenti. - Un contesto di codifica che non è più utilizzato deve essere inizializzato correttamente. Come fa uno, nell'ecosistema dei tubi, a garantire che tali cose (in questo caso si eseguono azioni som
IO
) siano prese in considerazione quando la tubazione viene distrutta?
Un esempio concreto sarebbe avvolgendo una libreria di compressione, nel qual caso il sopra può essere:
- La forza di compressione è sintonizzabile. Prepariamo il tubo e scorre allegramente. Come si dovrebbe procedere nel modo migliore per consentire la modifica dell'impostazione della forza di compressione mentre il tubo continua a funzionare, supponendo che l'accesso simultaneo al contesto del codec di compressione debba essere serializzato?
- La libreria di compressione ha allocato un mucchio di memoria fuori dall'heap di Haskell quando è stato configurato, e avremo bisogno di chiamare alcune funzioni di libreria per ripulire questo problema quando il tubo viene rimosso.
Grazie ... questo potrebbe essere tutto ovvio, ma sono abbastanza nuovo per l'ecosistema dei tubi.
Edit: La lettura di questo dopo la pubblicazione, sono abbastanza sicuro che sia la domanda più vaga che abbia mai chiesto di venire qui. Ugh! Siamo spiacenti ;-)
Avete controllato la libreria 'pipes-concorrenza'? Ha un [modulo tutorial] (http://hackage.haskell.org/package/pipes-concurrency-2.0.2/docs/Pipes-Concurrent-Tutorial.html) che potresti trovare utile. Darò questa risposta più da vicino più tardi, stasera. –
Oh, ho completamente trascurato le pipe-concorrenza in qualche modo! Grazie, sig. Ragazzo Pipes! Non sono ancora sicuro che copra interamente il mio caso, ma ci penserò. – gspr
@gspr I singoli tubi possono modificare il parametro "forza di compressione" o possono semplicemente leggerlo? Tutte le pipe devono condividere lo stesso parametro? – danidiaz