Comment puis-je obtenir un socket connect () non bloquant?
J'ai un assez simple problème ici. J'ai besoin de communiquer avec un grand nombre d'hôtes simultanément, mais je n'ai pas vraiment besoin d'une synchronisation parce que chaque demande est assez suffisant.
À cause de cela, j'ai choisi de travailler avec des sockets asynchrones, plutôt que de spammer les threads.
Maintenant j'ai un petit problème:
Async ça marche comme un charme, mais lorsque je me connecte à 100 hôtes, et je reçois 100 délais d'attente (timeout = 10 secondes), puis-je attendre de 1000 secondes, juste pour trouver toutes mes connexions échoué.
Est-il possible également d'obtenir non blocage de la douille se connecte?
Mon socket est déjà réglé à non bloquantes, mais les appels à connect() sont toujours de blocage.
Réduction du délai d'attente n'est pas une solution acceptable.
Je le fais en Python, mais je suppose que le langage de programmation ne marche pas vraiment d'importance dans ce cas.
Ai-je vraiment besoin d'utiliser des threads?
source d'informationauteur Tom
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour paralléliser le relie ainsi, depuis les prises de bloc lorsque vous définissez un délai d'attente. Sinon, vous ne pouvez pas définir un délai d'attente, et l'utilisation de l'sélectionnez le module.
Vous pouvez le faire avec la classe dispatcher dans le asyncore module. Jetez un oeil à la base client http exemple. Plusieurs instances de cette classe de ne pas bloquer les uns les autres sur se connecter. Vous pouvez le faire facilement à l'aide de threads, et je pense que rend le suivi de socket délais d'attente plus facile, mais puisque vous êtes déjà à l'aide de méthodes asynchrones vous pourriez aussi bien rester sur la même piste.
Comme un exemple, le code suivant fonctionne sur tous mes systèmes linux
Où dans cluster50 - cluster100, il y a de nombreuses machines qui ne répondent pas, ou inexistant. Cela commence tout de suite l'impression:
Ceci, cependant, ne tient pas compte de getaddrinfo, qui, pour le bloquer. Si vous rencontrez des problèmes de résoudre les requêtes dns, tout est à attendre. Vous avez probablement besoin de recueillir les requêtes dns séparément sur votre propre et utiliser les adresses ip de votre asynchrone en boucle
Si vous voulez un plus grand toolkit d'asyncore, jetez un oeil à Tordu De La Matrice. C'est un peu lourd à aborder, mais c'est le meilleur de la programmation réseau trousse d'outils que vous pouvez obtenir pour python.
Utiliser le
select
module. Cela vous permet d'attendre la fin d'e/S sur plusieurs sockets non blocage. Voici plus d'information sur sélectionner. À partir de la liés à la page:Malheureusement, il n'y a pas d'exemple de code qui montre le bug, donc c'est un peu dur de voir où ce bloc vient de.
Il fait quelque chose comme:
Le support de module utilise getaddrinfo l'interne, ce qui est une opération de blocage, en particulier lorsque le nom d'hôte n'existe pas. Un standard conforme dns client va attendre un certain temps pour voir si le nom n'existe, ou si il y a juste une certaine lenteur des serveurs dns impliqués.
La solution est de se connecter à des adresses ip uniquement ou utiliser un client dns qui permet à des non-blocage des demandes, comme pydns.
Utilisation tordu.
C'est un réseau asynchrone moteur écrit en Python, supportant de nombreux protocoles, et vous pouvez ajouter vos propres. Il peut être utilisé pour développer des clients et des serveurs. Il n'est pas sur le bloc de connexion.
Avez-vous regarder le asyncore module? Pourrait être juste ce dont vous avez besoin.