[socket] un socket.receive() non bloquant ....

un socket.receive() non bloquant .... [socket] - Python - Programmation

Marsh Posté le 05-05-2004 à 16:54:02    

slt a tous,
 
voila je fais une appli en python qui reçoit des instructions de tps en tps et j'ai une restriction assez sérieuse : ne pas utiliser de thread !
 
Donc il faudrait que je puisse faire un receive de tps en tps pour vérifier si des instructions sont arrivées mais la méthode socket.receive() est bloquante donc mon prog arrête de tourner tant qu'il n'a rien reçu  :cry:  
 
Mon idée était de combiner le timeout et 1 boucle while mais ça ne fonctionne pas .... bon place au bout de code, ce sera + compréhensible :
 

Code :
  1. def __init__(self,host=socket.gethostname(),port=10000):
  2.     self.host,self.rhost=host,host
  3.     self.port,self.rport=port,port
  4.     try:
  5.       print 'Creating Socket'
  6.       self.Socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  7.       self.Socket.settimeout(1.0)
  8.     except socket.error:
  9.       print 'Failed to create Socket object !'
  10.     try:
  11.       print 'Binding Socket'
  12.       self.Socket.bind((self.host,self.port))
  13.       print self
  14.     except socket.error:
  15.       print 'unable to bind '+str(self.host)+' on port '+str(self.port)
  16.   def Listen(self,msg='Accepted Connection from:'):
  17.     print 'Listening to port ',self.port
  18.     self.Socket.listen(1)
  19.     try:
  20.       self.conn,self.rhost=self.Socket.accept()
  21.       self.rhost=self.rhost[0]
  22.     except socket.timeout:
  23.       print 'no available connection, doing something else'
  24.       self.somethingElse()
  25.       return 0
  26.     if self.rhost:
  27.       print 'Got connection from',self.rhost
  28.       print msg,self.rhost
  29.       return 1
  30.   def Receive(self,size=65534):
  31.     try:
  32.       print 'Receiving data...'
  33.       received=self.conn.recv(size)
  34.       print 'received ',len(received)
  35.       return received
  36.     except socket.timeout:
  37.       print 'no data to receive, doing something else'
  38.       self.somethingElse()
  39.       return None
  40.   def main(self):
  41.     while self.Listen()!=1:
  42.       print 'main: listen one more time ...'
  43.     print 'main: ok, seemed to be connected now ;)'
  44.     while self.Receive()==None:
  45.       print 'main: receive one more time ...'


 
Un exemple d'exécution donnerait ça :
 

Citation :


Creating Socket
Binding Socket
Socket bound to Host=zsdev001,Port=10000
Listening to port  10000
no available connection, doing something else
hi! im doing something else
main: listen one more time ...
Listening to port  10000
no available connection, doing something else
hi! im doing something else
main: listen one more time ...
Listening to port  10000
Got connection from 192.168.1.130
Accepted Connection from: 192.168.1.130
main: ok, seemed to be connected now ;)
Receiving data...
Traceback (most recent call last):
  File "D:\zap-Lib\serv.py", line 69, in main
    while self.Receive()==None:
  File "D:\zap-Lib\serv.py", line 51, in Receive
    received=self.conn.recv(size)
socket.error: (10035, 'The socket operation could not complete without blocking'
)


 
J'ai essayé de faire un self.Socket.setblocking(0) ms la methode receive reste bloquante ....
 
une idée ??
d'avance merci!
 
vince

Reply

Marsh Posté le 05-05-2004 à 16:54:02   

Reply

Marsh Posté le 05-05-2004 à 17:10:25    

c'est curieux, cela devrait fonctionner...
essaye peut être de voir du côté de select.select() ?

Reply

Marsh Posté le 05-05-2004 à 17:14:32    

j'ai pas testé ton exemple, mais  
 
tu mélange timeout et blocking, je suis sur que ça foir ...
 
en mode non bloquant, quand y a rien à lire, ça retourne pas rien, ça lance une exception socket.error

Reply

Marsh Posté le 05-05-2004 à 17:15:26    

humm, bonne idée, je vais chercher de ce côté ...

Reply

Marsh Posté le 05-05-2004 à 17:24:23    

Taz a écrit :

j'ai pas testé ton exemple, mais  
 
tu mélange timeout et blocking, je suis sur que ça foir ...
 
en mode non bloquant, quand y a rien à lire, ça retourne pas rien, ça lance une exception socket.error


 
oui c vrai, ce que je voudrais faire, c'est faire un receive de tps en tps or le receive n'accepte pas le timeout ....  maintenant je pourrai me mettre en mode non bloquant mais comment créer une boucle pour faire ce receive à intervalle régulier ??

Reply

Marsh Posté le 05-05-2004 à 17:26:38    

tu fais des pauses et voilà

Reply

Marsh Posté le 05-05-2004 à 17:31:39    

des pauses, cad ?

Reply

Marsh Posté le 05-05-2004 à 17:35:05    

time.sleep(1.1)

Reply

Marsh Posté le 05-05-2004 à 17:50:22    

Taz a écrit :

time.sleep(1.1)


 
ha ok c'est tout con effectivement (désolé je débute en python), ms j'ai lu :

Citation :

sleep(secs)  Suspends execution for secs seconds. secs can be a float.


 
et ça ve dire que mon prog va arreter de tourner pdt 'secs', non ?
or justement je veux qu'il tourne et puis qu'il fasse le receive tous les 'laps' ....

Reply

Marsh Posté le 05-05-2004 à 18:04:47    

ben ton thread reçoit et dors voilà

Reply

Marsh Posté le 05-05-2004 à 18:04:47   

Reply

Marsh Posté le 05-05-2004 à 18:18:11    

Taz a écrit :

ben ton thread reçoit et dors voilà


 
oui ms justement, g pas de thread et je dois pas en utiliser, ms bon je vais me débrouiller avec tout ça.
 
merci à vs 2 pour les réponses  :jap:  
 
++
vince

Reply

Marsh Posté le 05-05-2004 à 18:19:26    

dtc .. tu vas faire un programme sous efficace et consommateur de CPU

Reply

Marsh Posté le 06-05-2004 à 10:37:30    

euhh, a priori , ton programme est un thread :p que tu le veuilles ou non.
à confirmer ^^

Reply

Marsh Posté le 06-05-2004 à 13:54:44    

...

Reply

Marsh Posté le 10-06-2004 à 17:14:37    

C'est un peu tard, mais ca sera peut etre kan meme utile a kkun...
 
pour eviter le thread tout en concervant une vitesse d'excution correct de ton code tu utilise un compteur + un time.sleep avec une toute petite tempo !
 
genre :
 

Code :
  1. cpt=0
  2.   while(1):
  3.     ...
  4.     time.sleep(0.01)
  5.     cpt=cpt+0.01
  6.     if cpt == 5: # pour tester ton socket toutes les 5 secondes
  7.       socket.receive(...)
  8.       cpt=0
  9.     ...
  10.     suite du traitement
  11.     ...


 
vala ;)


Message édité par Phod le 10-06-2004 à 17:16:49

---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
Reply

Marsh Posté le 10-06-2004 à 17:18:00    

n'importe quoi ...

Reply

Marsh Posté le 10-06-2004 à 17:21:48    

c'est peut etre pas tres elegant mais :
 
c'est ppas compliqué, y a pas de thread et ca ralenti pas 'trop' le reste du traitement.
 
tu aurai fait comment toi ?


---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
Reply

Marsh Posté le 10-06-2004 à 17:31:07    

tu plaisantes là ?

Reply

Marsh Posté le 10-06-2004 à 17:34:52    

ben non. si tu critique mon truc (qui je le reconnais est n'est pas tres 'clean') c'est que tu pense a mieu non ?


Message édité par Phod le 10-06-2004 à 17:35:23

---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed