Comment OkHttp effectue-t-il des requêtes HTTP parallèles avec des connexions HTTP apparemment synchrones, sans l'utilisation de threads?
J'ai fait quelques tests de performance avec le OkHttp de la bibliothèque et l'a trouvé pour être grand. Il n'a de 80 demandes de http://httpbin.org/delay/1qui délibérément pause de 1 seconde pour chaque demande, en 4.7 s sur mon HTC One téléphone. J'ai regardé le code et je vais essayer de trouver pourquoi il est si rapide. Les développeurs de forme Carrée (Inc) annoncent le Regroupement de connexions et d'appels Asynchrones, les deux qui, je crois, de contribuer à la bonne performance.
Je viens de la .Monde NET et dans les .NET 4.5, vous avez un vrai async HTTP bibliothèque avec un Async GetResponse-méthode. En cédant le fil de l'OS lors de l'attente de la réponse, vous libérer des ressources afin de lancer plusieurs requêtes HTTP, ou d'autres choses. Le truc c'est que je ne peut pas voir le même schéma avec OkHttp (ou tout autre HTTP bibliothèque pour Android j'ai regardé dans). Alors, comment puis-je exécuter toujours 80 1 seconde demande dans les 4 secondes? Il n'est pas basé sur le thread, non? Je ne suis pas de tir jusqu'à 80 (ou 20) les threads?
Pour être plus précis, dans com.squareup.okhttp.Appel.beginRequest()je vois pas céder du fil entre le sendRequest
et getResponse
appels:
if (canceled) return null;
try {
engine.sendRequest();
if (request.body() != null) {
BufferedSink sink = engine.getBufferedRequestBody();
request.body().writeTo(sink);
}
engine.readResponse();
} catch (IOException e) {
HttpEngine retryEngine = engine.recover(e, null);
if (retryEngine != null) {
engine = retryEngine;
continue;
}
//Give up; recovery is not possible.
throw e;
}
Response response = engine.getResponse();
Donc encore une fois, comment faire 80 "parallèle" des appels possible?
Je n'ai pas besoin de savoir afin d'utiliser la bibliothèque, mais de programmation asynchrone m'intéresse et j'aimerais vraiment comprendre comment OkHttp/SquareInc a réglé ce problème.
source d'informationauteur Nilzor
Vous devez vous connecter pour publier un commentaire.
J'ai fait quelques tests moi-même en reliant les OkHttp source dans mon projet et de l'injection de l'enregistrement dans la base demande de la classe Call.java. Ce que j'ai trouvé était que OkHttp en effet utilise un thread pour chaque appel et ne pas le rendement tout en attendant la réponse que j'ai tort. La seule raison qu'il est plus rapide que par exemple le Volley, c'est que le Volley est codé en dur un thread limite de 4, tandis que OkHttp utilise
Integer.MAX_VALUE
(Dipatcher.java
ligne 58):Ici est un extrait de l'LogCat journal quand j'ai mis en file d'attente et excecuted de 80 demandes "asynchrone":
La troisième colonne de format
xxxxx-yyyyy
indique l'id de processus (x) et l'id de thread (y). Remarquez comment chaque demande reçoit son propre thread et comment le même thread gère la réponse. Log complet. Cela signifie que nous avons 80 blocage des threads en attendant des réponses, ce qui n'est pas la façon dont vrai de programmation asynchrone doit être fait.Dans OkHttp /Square Inc défense, ils ne prétendent jamais avoir la vraie fin à la fin de l'asynchrone de la communication HTTP, ils ne donnent qu'une interface asynchrone pour le consommateur. Ce qui est bien. Et il exécute aussi bien et un tas d'autres trucs. C'est une bonne bibliothèque, mais j'en ai mal interprété pour avoir la vraie asynchrone de la communication HTTP.
Depuis, j'ai compris à rechercher les mots-clés "NIO" pour trouver ce que je cherche. Les bibliothèques comme AndroidAsync et Ion semble prometteuse.
OkHttp ne pas utiliser des sockets asynchrones à ce moment. Si vous utilisez l'API asynchrone avec
enqueue()
leDispatcher
va faire tourner plusieurs threads et de faire de multiples demandes simultanées. Si vous utilisez le mêmeOkHttp
client pour toutes les demandes se limite à 5 connexions de l'hôte.