Guardando una gamma di linguaggi multipiattaforma, librerie e toolkit della GUI, noto spesso un'assenza evidente di supporto per l'I / O di file asincrono. Questo sembra un fattore troppo comune per essere una supervisione casuale in tutti loro. Tuttavia non ne so abbastanza dei sistemi operativi individuali o di questi linguaggi / librerie per capire perché non lo presentano.
Ecco alcuni esempi.
- Il asyncio di Python (iniziato in 3.4) contiene metodi per gestire in modo asincrono l'attività di rete e di sottoprocesso, ma nulla per leggere i file dal disco.
- La libreria Twisted per la programmazione basata su eventi e protocolli in Python sembra non contenere nulla per async file I / O.
- Il qt 5
QFile
in particolare non emette ilreadyRead
obytesWritten
segnali, in contrasto con altre implementazioniQIODevice
per il networking. - Tutte le classi correlate ai file di wxWidget sono completamente sincrone.
Questi sono solo gli ultimi quattro che ho cercato; è possibile che ho scelto quattro di fila senza file asincrono IO per coincidenza, ma sono tutti molto popolari e stabili. So che non sono le uniche librerie popolari che ho usato negli ultimi dieci anni in cui mi sono perso.
Forse c'è meno richiesta di questo rispetto alla lettura dei dati da un socket o sottoprocesso, ma è così poco da essere considerato indesiderato? Un file apparentemente locale potrebbe essere sull'altro lato di una connessione di rete (ad esempio una condivisione SMB o una montatura NSF) che non è affatto vero che l'accesso al disco locale sarà più veloce di quanto un utente noterebbe . Non è nemmeno necessariamente vero per un SSD locale, nuovo di zecca per quella materia.
Consigli comuni per eseguire il proprio file asincrono IO con thread sembra contrario alla saggezza prevalente, quando così tanto di ciò che motiva l'uso del toolkit è non a far da te, specialmente quando si tratta di qualcosa che coinvolge il threading. So che è possibile, e forse non così difficile, ma non ci sono molte altre cose che sono comunemente disponibili in queste librerie e lingue.
Prendiamo Qt come esempio (estraendolo da un commento su una risposta). In Qt, se voglio fare X
senza mettere in pausa il mio intero programma, posso usare Y
:
- Se X = ridisegna una tela; Y = usa segnali e slot
- Se X = legge i dati via HTTP; Y = usa segnali e slot
- Se X = recupera i dati da un sottoprocesso; Y = usa segnali e slot
- Ma se X = recupera i dati dal disco rigido; Y = implementa qualcosa con un thread, o forse due thread, due semafori, speciali indicatori di memoria condivisa e forse un mucchio di altre cose.
Se sia o non sia semplice per me implementare è fuori questione. Il punto è che il file IO è un'operazione che può bloccare, ma è costantemente dispari in toolkit e librerie cross-platform non avendo una gestione di alto livello.
Fondamentalmente sembra che questa omissione richieda una maggiore complessità da parte dell'utente della biblioteca per un'attività non insolita, quando l'obiettivo di queste librerie è quello di assorbire quel tipo di complessità di implementazione di basso livello. Sembra strano che l'inserimento di un file locale sull'altro lato di un server web locale lo renda più semplice per accedere a un programma basato su eventi.
Per essere chiari, e per chiarire la mia domanda, questo non è un reclamo relativo alla mancanza di funzionalità. Voglio capire meglio le librerie multipiattaforma e le differenze del sistema operativo, quindi sono sinceramente curioso di sapere perché questa situazione è sorto e se c'è una qualche limitazione tecnica o altro vincolo alla radice di esso.