J'ai parcouru Internet à la recherche d'une solution à mon problème avec Python. J'essaie d'utiliser une connexion urllib2 pour lire un flux potentiellement infini de données à partir d'un serveur HTTP. Cela fait partie d'une communication interactive, il est donc important que je puisse obtenir les données disponibles, même si ce n'est pas un tampon complet. Il semble y avoir aucun moyen d'avoir read
\ readline
retourner les données disponibles. Il bloquera pour toujours l'attente du flux entier (sans fin) avant qu'il ne revienne.Prises en Python Constipées urllib2
Même si je mets le descripteur de fichier sous-jacent à non-bloquant en utilisant fnctl, l'objet de fichier urllib2 bloque encore !! En général, il semble qu'il n'y ait aucun moyen de rendre les objets-fichiers python, après read
, renvoyer toutes les données disponibles s'il y en a et bloquer autrement.
J'ai vu quelques articles sur des personnes qui cherchaient de l'aide, mais je n'ai vu aucune solution. Ce qui donne? Est-ce que je manque quelque chose? Cela semble être un tel cas d'utilisation normal à complètement ruiner! J'espère pouvoir utiliser la capacité d'urllib2 pour détecter les proxies configurés et utiliser l'encodage en morceaux, mais je ne peux pas le faire si ça ne va pas coopérer.
Edit: Sur demande, voici quelques exemples de code
Client:
connection = urllib2.urlopen(commandpath)
id = connection.readline()
Supposons maintenant que le serveur utilise morcelées le codage de transfert, et écrit un morceau sur le flux et le morceau contient les ligne, puis attend. La connexion est toujours ouverte, mais le client a des données en attente dans un tampon.
Je ne peux pas obtenir read
ou readline
pour retourner les données je sais qu'il a l'attente, car il essaie de lire jusqu'à la fin de la connexion. Dans ce cas, la connexion peut ne jamais se fermer et attendre pour toujours ou jusqu'à ce qu'un délai d'inactivité se produise, coupant la connexion. Une fois la connexion coupée, elle reviendra, mais ce n'est évidemment pas le comportement que je veux.
Je ne suis pas sûr de comprendre correctement ce que vous essayez d'accomplir. Que voulez-vous dire par blocage? Voulez-vous dire que vous souhaitez que votre script continue à s'exécuter lorsque le flux ne fournit plus de données ou quelque chose d'autre? – jsalonen
Veuillez fournir un exemple de code; nous avons besoin au moins de faire une suggestion. – tzot