Sta avendo una chiamata di funzione bloccare un processo di progettazione male?

StackOverflow https://stackoverflow.com/questions/1835494

  •  11-09-2019
  •  | 
  •  

Domanda

Sto scrivendo un'API che viene utilizzato per ricevere alcuni dati da un'altra applicazione. Attualmente la funzione è progettato per bloccare fino alla ricezione dei dati. Nella mia mente questo limita gli sviluppatori che utilizzano le API di utilizzare il multithreading o una sorta di design multi-processo. Quindi è meglio per una funzione per bloccare o per restituire un nullo e poi dormire per alcuni millisecondi prima di riprovare.

Si noti l'altra applicazione non può avere tutti i dati da inviare tramite l'API per un periodo di tempo indeterminato.

L'API è scritto in C ++

È stato utile?

Soluzione

Perché non usare un richiamata ?

Altri suggerimenti

Si potrebbe definire l'API per consentire all'utente di passare un valore di timeout facoltativo. Se il timeout non è specificato, quindi le attese funzione API a tempo indeterminato, molto simile a come funziona select().

Si consideri un'altra opzione: utilizzare un asincrona di transazione -> problema request e fornire una callback address con ticket id . Quando la risposta è disponibile, l'end-point servizio callbacks l'applicazione con la ticket id e del risultato; -)

Si dovrebbe evitare come must come possibilità di blocco quando è possibile.


Come dici tu:

  

Si noti l'altra applicazione non può avere tutti i dati da inviare tramite l'API per un periodo di tempo indeterminato.

In questo caso, utilizzando un sincrone legami di interfaccia le risorse inutilmente.

Non hai detto che lingua si tratta, ma suona come la vostra API è in ascolto o il controllo per qualche evento, e gli utenti delle API sono o bloccando o polling vostra API per determinare se l'evento è accaduto?

E 'possibile utilizzare un callback? Gli utenti delle API sarebbero registrarsi per le notifiche della manifestazione che accadono, e quando la libreria rileva l'evento che utilizzeranno il callback per notificare tutti gli ascoltatori.

Quando le applicazioni chiama la funzione read() O / S api, cosa si aspetta a bloccare? Certo che sì, almeno per impostazione predefinita. In alcune circostanze, ioctl di consentire a un programmatore di modificare il comportamento di essere asincrono, che è particolarmente comune nelle applicazioni di rete.

che hai versato pochissima luce su ciò che la vostra API è di circa, in modo da considerare:

  • Ha senso che un utente API vorrebbe essere bloccato? Cioè, c'è poco da fare fino a quando non ritorna.
  • se si stesse scrivendo un'applicazione per l'API, che cosa ti aspetti che faccia? Si dovrebbe scrivere alcune applicazioni di esempio per la propria formazione, così come per documentare le API.
  • C'è qualche motivo per cui l'utente API non sarebbe multithread (o una forchetta, etc.) richieste all'API?

Se si desidera una soluzione riutilizzabile si potrebbe applicare l'Asynchronous Design 'modello' che è comune in .NET ma può anche essere implementato in C ++ come dimostrato in questo progetto CodeProject .

Non c'è niente di sbagliato con fornitura di chiamate sia sincrone e asincrone per la stessa caratteristica nell'interfaccia.

Personalmente andrei solo queste lunghezze se ho bisogno di servire più richieste (nel qual caso è possibile mettere in coda le richieste 'BeginOperation' per esempio), o ci sono molte operazioni potenzialmente asincrone nell'interfaccia (e voglio un standardizzati, flessibili modello). Se si può gestire solo una richiesta alla volta un time-out è di solito sufficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top