Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb avec socket.py

6 réponses
Avatar
jean-michel bain-cornu
Bonsoir,

J'ai eu aujourd'hui un pb qui m'inquiète un peu.
Il s'agit d'un plantage dans imaplib lors d'un fetch sur un message
assez gros (7mo) venant d'Exchange ; malheureusement je n'ai pas gardé
le message, mais c'était une memory error dans la ligne 303 de socket.py
data = self._sock.recv(recv_size)
Cette ligne fait partie d'une boucle while qui récupère un buffer
morceau par morceau en le mettant dans une liste 'buffers', puis recolle
le tout à la fin avec un "".join(buffers)

Après investigations gouguelesques infructueuses, recherche dans la
liste des fix de la dernière version de python 2.4 aussi sans résultat,
j'ai corrigé moi-même.
Le morceau de prog figure ci-après, mais en résumé, j'ai remplacé la
liste 'buffers' par une chaîne à laquelle j'ajoute les morceaux reçus
les uns après les autres par un bête '+' (les lignes remplacées sont en
commentaires).
C'est surement un peu moins rapide, mais ça marche.

Ai-je raté quelque chose ?
Quelqu'un a-t-il déjà rencontré un pb similaire ?

Je n'arrive pas à croire qu'un bête buffer de 7mo puisse poser problème,
et j'ai déjà eu beaucoup plus gros par ailleurs.

Je fais tout ça avec wXp et python 2.4.2.

Le bout de code:
buf_len = len(data)
if buf_len >= size:
self._rbuf = data[size:]
return data[:size]
#~ buffers = []
buffers2 = ''
if data:
#~ buffers.append(data)
buffers2= data
self._rbuf = ""
while True:
left = size - buf_len
recv_size = max(self._rbufsize, left)
data = self._sock.recv(recv_size)
if not data:
break
#~ buffers.append(data)
n = len(data)
if n >= left:
self._rbuf = data[left:]
#~ buffers[-1] = data[:left]
buffers2= buffers2+data[:left]
break
else:
buffers2= buffers2+data
buf_len += n
#~ return "".join(buffers)
return buffers2

6 réponses

Avatar
hg
jean-michel bain-cornu wrote:

Bonsoir,

J'ai eu aujourd'hui un pb qui m'inquiète un peu.
Il s'agit d'un plantage dans imaplib lors d'un fetch sur un message
assez gros (7mo) venant d'Exchange ; malheureusement je n'ai pas gardé
le message, mais c'était une memory error dans la ligne 303 de socket.py
data = self._sock.recv(recv_size)
Cette ligne fait partie d'une boucle while qui récupère un buffer
morceau par morceau en le mettant dans une liste 'buffers', puis recolle
le tout à la fin avec un "".join(buffers)

Après investigations gouguelesques infructueuses, recherche dans la
liste des fix de la dernière version de python 2.4 aussi sans résultat,
j'ai corrigé moi-même.
Le morceau de prog figure ci-après, mais en résumé, j'ai remplacé la
liste 'buffers' par une chaîne à laquelle j'ajoute les morceaux reçus
les uns après les autres par un bête '+' (les lignes remplacées sont en
commentaires).
C'est surement un peu moins rapide, mais ça marche.

Ai-je raté quelque chose ?
Quelqu'un a-t-il déjà rencontré un pb similaire ?

Je n'arrive pas à croire qu'un bête buffer de 7mo puisse poser problème,
et j'ai déjà eu beaucoup plus gros par ailleurs.

Je fais tout ça avec wXp et python 2.4.2.

Le bout de code:
buf_len = len(data)
if buf_len >= size:
self._rbuf = data[size:]
return data[:size]
#~ buffers = []
buffers2 = ''
if data:
#~ buffers.append(data)
buffers2= data
self._rbuf = ""
while True:
left = size - buf_len
recv_size = max(self._rbufsize, left)
data = self._sock.recv(recv_size)
if not data:
break
#~ buffers.append(data)
n = len(data)
if n >= left:
self._rbuf = data[left:]
#~ buffers[-1] = data[:left]
buffers2= buffers2+data[:left]
break
else:
buffers2= buffers2+data
buf_len += n
#~ return "".join(buffers)
return buffers2


Par plantage tu veux dire exception ? ... si oui laquelle ?

Avatar
jean-michel bain-cornu
Il s'agit d'un plantage dans imaplib lors d'un fetch sur un message
assez gros (7mo) venant d'Exchange ; malheureusement je n'ai pas gardé
le message, mais c'était une memory error dans la ligne 303 de socket.py
data = self._sock.recv(recv_size)


Par plantage tu veux dire exception ? ... si oui laquelle ?

Oui, pardon pour l'imprécision, il s'agit d'une exception memory error.



Avatar
hg
jean-michel bain-cornu wrote:


Je fais tout ça avec wXp et python 2.4.2.

Pour info, j'ai essayé aujourd'hui sur un serveur w2k3, et ça ne plante

pas. Le pb vient peut-être de mon PC, qui est très chargé en soft divers
et variés.


Il faudrait pouvoir effectivement reproduire le problème ... peut être
l'exception et récupère les infos systèmes du moment ...
hg


Avatar
hg
hg wrote:

jean-michel bain-cornu wrote:


Je fais tout ça avec wXp et python 2.4.2.

Pour info, j'ai essayé aujourd'hui sur un serveur w2k3, et ça ne plante

pas. Le pb vient peut-être de mon PC, qui est très chargé en soft divers
et variés.


Il faudrait pouvoir effectivement reproduire le problème ... peut être
l'exception et récupère les infos systèmes du moment ...
hg


pardon: peut être attrape l'exception et récupère les infos systèmes du
moment ...



Avatar
jean-michel bain-cornu

Je fais tout ça avec wXp et python 2.4.2.

Pour info, j'ai essayé aujourd'hui sur un serveur w2k3, et ça ne plante

pas. Le pb vient peut-être de mon PC, qui est très chargé en soft divers
et variés.

Avatar
jean-michel bain-cornu
Bonjour,

Je fais tout ça avec wXp et python 2.4.2.

Pour info, j'ai essayé aujourd'hui sur un serveur w2k3, et ça ne plante

pas. Le pb vient peut-être de mon PC, qui est très chargé en soft divers
et variés.


Bon effectivement, ça ne le fait que sur mon PC de dev, qui n'est
peut-être pas un modèle de stabilité.
Donc comme j'ai un correctif, et que visiblement personne d'autre n'a le
problème, je ne pousse pas plus loin pour le moment.
A+
jm