2010-09-24 5 views
4

Je travaille sur un client pour un service web utilisant pycurl. Le client ouvre une connexion à un service de flux et l'engendre dans un thread séparé. Voici une version dépouillée de la façon dont la connexion est établie:Impossible de fermer un flux ouvert avec pycurl

def _setup_connection(self): 
    self.conn = pycurl.Curl() 
    self.conn.setopt(pycurl.URL, FILTER_URL) 
    self.conn.setopt(pycurl.POST, 1) 
    . 
    . 
    . 
    self.conn.setopt(pycurl.HTTPHEADER, headers_list) 
    self.conn.setopt(pycurl.WRITEFUNCTION, self.local_callback) 

def up(self): 
    if self.conn is None: 
     self._setup_connection() 
    self.perform() 

Maintenant, quand je veux fermer la connexion vers le bas, si je l'appelle

self.conn.close() 

je reçois l'exception suivante:

error: cannot invoke close() - perform() is currently running 

Ce qui, d'une certaine manière, a du sens, la connexion est constamment ouverte. J'ai été la chasse autour et ne peux pas sembler trouver un moyen de contourner ce problème et de fermer la connexion proprement.

+0

Avez-vous déjà réussi à comprendre comment faire cela? – Tereno

+0

voir http://stackoverflow.com/questions/6031921/how-to-halt-kill-stop-or-close-a-pycurl-request-on-a-stream-example-given-using –

Répondre

0

Vous avez évidemment montré quelques méthodes d'une classe wrapper curl, ce que vous devez faire est de laisser l'objet se manipule lui-même.

def __del__(self): 
    self.conn.close() 

et n'appelez pas explicitement la fermeture. Lorsque l'objet termine son travail et que toutes les références sont supprimées, la connexion curl sera fermée.

1

Il semble que vous appeliez close() dans un thread alors qu'un autre thread exécute perform(). Heureusement, la bibliothèque vous prévient plutôt que de descendre dans un comportement inconnu.

Vous ne devez utiliser la session curl qu'à partir d'un thread - ou faire en sorte que le thread perform() communique quand l'appel à perform() est terminé.

+0

J'utilise un signal envoyé au thread contenant la connexion pycurl pour lancer l'appel self.conn.close(). Le problème est, sauf erreur et timeout, perform() n'est jamais complet, les informations continueront à être diffusées jusqu'à ce que l'une des deux parties ferme la connexion (j'interface avec l'api du flux Twitter, si cela peut aider). – boldfield

Questions connexes