2010-10-21 10 views
1

Pour implémenter un simple protocole en python, j'ai utilisé un thread pour surveiller les accusés de réception envoyés par le destinataire. Pour ce faire, j'utilise un fil dans une fonctionTerminer un sockert.recv dans un thread en Python

def ackListener(self): 

    while self.waitingforack: 
     ack = self.socket_agent.recv(4) 
     ... 
    exit() 

self.waitingforack est un booléen je me mis à False quand je l'ai reçu un accusé de réception pour tous les messages que je l'ai envoyé.

Le problème est que mon code bloque à l'opération self.socket_agent.recv(4), la modification de la valeur de waitingforack est fait trop tard

Y at-il un moyen de forcer le thread de mettre fin quand je ne suis pas en attente de ack plus?

Merci

Répondre

2

Rappelez-vous que ces opérations comme recv bloquent les opérations dans votre cas. L'appel de cette fonction est donc bloqué sauf si vous avez reçu les données.

Il y a deux façons de s'y prendre:

Marque socket non bloquant

socket.setblocking(0) 

Définir une valeur de délai d'attente voir: http://docs.python.org/library/socket.html#socket.socket.settimeout

socket.settimeout(value) 

utilisation asynchrone approche

+0

Merci, il semble que setblocking et settimeout peut me aider. Le problème est que je veux modifier la valeur de blocage ou de délai seulement au moment où j'ai envoyé tous les messages (ce qui est quand je suis déjà bloqué dans l'opération recv) ... –

+1

@Martin Trigaux: Comme dit, si vous avez déjà appelé recv, vous serez bloqué. Vous devez soit définir sur non-blocage ou diminuer le délai de verrouillage et concevoir la solution autour de lui. – pyfunc

Questions connexes