Re: [Python] problema con socket (lettura blocking)

2013-10-05 Per discussione Marco Buttu

On 10/04/2013 06:09 PM, Vittorio Spina wrote:

Mi collego a un laser con interfaccia ethernet. Io faccio i seguenti passi

 1. apro il socket
 2. leggo un B alla volta con recv(1) finchè non trovo la magic word
 3. trovata la magic word leggo un po di bytes con dentro le
informazioni fra cui, numero di scansione e numero di punti
scansionati
 4. con un ciclo leggo tanti pacchetti successivi all'header quanti
sono i numeri scansionati
 5. mostro i punti con pygame.

c'è un ritardo di circa 5 secondi cosa che nel suo viewer non c'è.
Leggendo i numeri di scansione mi accorgo che sono consequenziali 
senza salti, il laser cioè mi aspetta e accumulo un ritardo per la 
velocità del mio programma di visualizzazione.


Perche' non esegui il punto 5 in modo concorrente? Per me e' la' che 
accumuli la maggior parte del ritardo.


se invece apro ogni volta che leggo il socket, va un po' a scatti 
perchè l'apertura del socket è cosa pesante, ma funziona, scattando un 
poco.


Questo non mi torna, perche' mi aspetto ugualmente un ritardo. Forse in 
questo caso il laser produce il punto, non puo' inviarlo perche' non hai 
completato le tue operazioni (non sei ancora tornato
al punto 1) e quindi il socket e' ancora chiuso, cosi' scarta il punto 
ma conserva il suo l'ID per assegnarlo al prossimo punto che produrra', 
che inviera' quando trovera' la connessione aperta (altrimenti lo 
scartera', e il ciclo continua).
Se il viewer vede solo i punti che il laser ha inviato correttamente al 
client, allora e' per questo che vi sembra che funzioni, perche' non vi 
accorgete dei ritardi ma in realta' state perdendo dei punti.


In definitiva, il mio consiglio e' `paralellizzare` il punto 5, e se non 
bastasse anche intervenire sul protocollo


--
Marco Buttu

INAF - Osservatorio Astronomico di Cagliari
Via della Scienza, Loc. Cuccuru Angius
09047 Selargius (CA)
Email: mbu...@oa-cagliari.inaf.it

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-05 Per discussione Giovanni Vittorio Spina

 Il giorno 05/ott/2013, alle ore 08:08, Marco Buttu 
 mbu...@oa-cagliari.inaf.it ha scritto:
 
 On 10/04/2013 06:09 PM, Vittorio Spina wrote:
 Mi collego a un laser con interfaccia ethernet. Io faccio i seguenti passi
 apro il socket
 leggo un B alla volta con recv(1) finchè non trovo la magic word
 trovata la magic word leggo un po di bytes con dentro le informazioni fra 
 cui, numero di scansione e numero di punti scansionati
 con un ciclo leggo tanti pacchetti successivi all'header quanti sono i 
 numeri scansionati
 mostro i punti con pygame.
 c'è un ritardo di circa 5 secondi cosa che nel suo viewer non c'è.
 Leggendo i numeri di scansione mi accorgo che sono consequenziali senza 
 salti, il laser cioè mi aspetta e accumulo un ritardo per la velocità del 
 mio programma di visualizzazione.
 
 Perche' non esegui il punto 5 in modo concorrente? Per me e' la' che accumuli 
 la maggior parte del ritardo.
No, raggiungo i 70 fps e la lettura dei punti é in un thread separato
Sapete come si usa la select?
 
 se invece apro ogni volta che leggo il socket, va un po' a scatti perchè 
 l'apertura del socket è cosa pesante, ma funziona, scattando un poco.
 
 Questo non mi torna, perche' mi aspetto ugualmente un ritardo. Forse in 
 questo caso il laser produce il punto, non puo' inviarlo perche' non hai 
 completato le tue operazioni (non sei ancora tornato
 al punto 1) e quindi il socket e' ancora chiuso, cosi' scarta il punto ma 
 conserva il suo l'ID per assegnarlo al prossimo punto che produrra', che 
 inviera' quando trovera' la connessione aperta (altrimenti lo scartera', e il 
 ciclo continua).
 Se il viewer vede solo i punti che il laser ha inviato correttamente al 
 client, allora e' per questo che vi sembra che funzioni, perche' non vi 
 accorgete dei ritardi ma in realta' state perdendo dei punti.
 
 In definitiva, il mio consiglio e' `paralellizzare` il punto 5, e se non 
 bastasse anche intervenire sul protocollo
 -- 
 Marco Buttu
 
 INAF - Osservatorio Astronomico di Cagliari
 Via della Scienza, Loc. Cuccuru Angius
 09047 Selargius (CA)
 Email: mbu...@oa-cagliari.inaf.it
 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-04 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 04/10/2013 17:33, Vittorio Spina wrote:
 Ciao a tutti. Ho scritto un programma che riceve dati da un Laser
 con interfaccia Ethernet.
 

Quale e' il protocollo usato dallo strumento?

 il programma riassumento ha la seguente forma:
 
 from socket import * import config s = socket(AF_INET,SOCK_STREAM) 
 s.connect((config.IP, config.PORT)) while 1: if s.recv(1)==\xAA: 
 letturaNumero = s.recv(1)
 
 quando lancio il codice noto che letturaNumero identifica un
 numero progressivo.

Noti?
Non e' specificato nel protocollo?

 E' come insomma se il device stesse ad aspettarmi fino alla
 lettura successiva, cosa che io non voglio poich│ i dati sono tanti
 e poi mi ritrovo con una sorta di macchina del passato.
 

Cosa vuoi fare, allora?

 Se invece faccio come segue
 
 while 1: s = socket(AF_INET,SOCK_STREAM) s.connect((config.IP,
 config.PORT)) if s.recv(1)==\xAA: letturaNumero = s.recv(1)
 
 e cio│ apro e chiudo di continuo il socket, tutto funziona come
 vorrei. Ma l'operazione di apertura e chiusira del socket │ in
 effetti una cosa pensante. C'│ un modo per dire al socket di aprire
 una connessione e che il device non stia ad aspettarmi?

select o poll.
Usa select per attendere fino a quando lo strumento non ha inviato dei
dati, e chiama recv solo allora.

 Grazie.
 
 p.s usando il comando s.setblocking(0) ricevo l'errore: [Errno
 10035] Impossibile completare immediatamente l'operazione sul 
 socket non a blocchi

Probabilmente nel tuo caso non hai bisogno di impostare il socket in
modalita' non bloccante, ma dipende dal protocollo usato dallo strumento.


Ciao  Manlio
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/

iEYEARECAAYFAlJO4VwACgkQscQJ24LbaURMqgCaAoM+5ctD1G8NMmW4ZTA0LHYL
5rgAn1cC5cgmGkjjKQ435Op1y4PhmooS
=FBUM
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-04 Per discussione Vittorio Spina

Il 04/10/2013 17:40, Manlio Perillo ha scritto:

-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 04/10/2013 17:33, Vittorio Spina wrote:

Ciao a tutti. Ho scritto un programma che riceve dati da un Laser
con interfaccia Ethernet.


Quale e' il protocollo usato dallo strumento?
in che senso il protocollo? E' una connessione TCP-IP... intendi come 
sono fatti i dati? in quel caso è un po complesso, diciamo che lui spara 
di continuo un header dove è scritto quanti punti ha scnsionato e poi la 
lista dei punti...



il programma riassumento ha la seguente forma:

from socket import * import config s = socket(AF_INET,SOCK_STREAM)
s.connect((config.IP, config.PORT)) while 1: if s.recv(1)==\xAA:
letturaNumero = s.recv(1)

quando lancio il codice noto che letturaNumero identifica un
numero progressivo.

Noti?
Non e' specificato nel protocollo?
si ovviamente è specificato, diciamo che avvio il programma e sono alla 
scansione tipo 5500 e di lì inizio 5501, 2, ...

chiudo un attimo e riavvio il codice e sono a 7324, 7325...
insomma rimane appeso, mi aspetta.



E' come insomma se il device stesse ad aspettarmi fino alla
lettura successiva, cosa che io non voglio poich│ i dati sono tanti
e poi mi ritrovo con una sorta di macchina del passato.


Cosa vuoi fare, allora?
voglio i dati in tempo reale. Se apro e chiudo il socket scatta un po' 
ma funziona, altrimenti vedo con un ritardo di circa 5 secondi, che non 
va bene.



Se invece faccio come segue

while 1: s = socket(AF_INET,SOCK_STREAM) s.connect((config.IP,
config.PORT)) if s.recv(1)==\xAA: letturaNumero = s.recv(1)

e cio│ apro e chiudo di continuo il socket, tutto funziona come
vorrei. Ma l'operazione di apertura e chiusira del socket │ in
effetti una cosa pensante. C'│ un modo per dire al socket di aprire
una connessione e che il device non stia ad aspettarmi?

select o poll.
Usa select per attendere fino a quando lo strumento non ha inviato dei
dati, e chiama recv solo allora.

non ho capito come, puoi farmi un esempio?



Grazie.

p.s usando il comando s.setblocking(0) ricevo l'errore: [Errno
10035] Impossibile completare immediatamente l'operazione sul
socket non a blocchi

Probabilmente nel tuo caso non hai bisogno di impostare il socket in
modalita' non bloccante, ma dipende dal protocollo usato dallo strumento.


Ciao  Manlio
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/

iEYEARECAAYFAlJO4VwACgkQscQJ24LbaURMqgCaAoM+5ctD1G8NMmW4ZTA0LHYL
5rgAn1cC5cgmGkjjKQ435Op1y4PhmooS
=FBUM
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


--
==
Spina Giovanni Vittorio
email:  vittorio.sp...@gmail.com
--
mobile: +39 389 15 24 211
==

:: AVVISO PRIVACY
= = = = = = = = = = = = = = = = = = = =
Il contenuto della presente e-mail ed i suoi allegati,
sono diretti esclusivamente al destinatario e devono
ritenersi riservati, con divieto di diffusione o di uso
non conforme alle finalità per le quali la presente e-mail
è stata inviata.
Pertanto, ne è vietata la diffusione e la comunicazione
da parte di soggetti diversi dal destinatario, ai sensi degli
artt. 616 e ss. c.p. e D.lgs n. 196/03 Codice Privacy.

Se la presente e-mail ed i suoi allegati sono stati ricevuti
per errore, siete pregati di distruggere quanto ricevuto e
di informare il mittente al seguente recapito:
Mailto:vittorio.sp...@gmail.com
==

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-04 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 04/10/2013 17:46, Vittorio Spina wrote:
 Il 04/10/2013 17:40, Manlio Perillo ha scritto: On 04/10/2013 
 17:33, Vittorio Spina wrote:
 Ciao a tutti. Ho scritto un programma che riceve dati da un 
 Laser con interfaccia Ethernet.
 
 Quale e' il protocollo usato dallo strumento?
 in che senso il protocollo?

Nel senso in che modo sono scambiati i dati tra i due punti della
connessione, ed il formato di questi dati.

 E' una connessione TCP-IP... intendi come
 sono fatti i dati? in quel caso è un po complesso, diciamo che 
 lui spara di continuo un header dove è scritto quanti punti ha 
 scnsionato e poi la lista dei punti...
 

Ok, allora non capisco quale è il tuo problema.

 il programma riassumento ha la seguente forma:
 
 from socket import * import config s = 
 socket(AF_INET,SOCK_STREAM) s.connect((config.IP, 
 config.PORT)) while 1: if s.recv(1)==\xAA: letturaNumero = 
 s.recv(1)
 
 quando lancio il codice noto che letturaNumero identifica un
  numero progressivo.
 Noti? Non e' specificato nel protocollo?
 si ovviamente è specificato, diciamo che avvio il programma e 
 sono alla scansione tipo 5500 e di lì inizio 5501, 2, ... chiudo 
 un attimo e riavvio il codice e sono a 7324, 7325... insomma 
 rimane appeso, mi aspetta.
 

 [...]

 E' come insomma se il device stesse ad aspettarmi fino alla 
 lettura successiva, cosa che io non voglio poich│ i dati
 sono tanti e poi mi ritrovo con una sorta di macchina del 
 passato.
 
 Cosa vuoi fare, allora?
 voglio i dati in tempo reale. Se apro e chiudo il socket scatta 
 un po' ma funziona, altrimenti vedo con un ritardo di circa 5 
 secondi, che non va bene.
 

Ok, finalmente ho capito cosa intendi.

Il problema e' che sei troppo lento a leggere, e non ci puoi fare
niente a parte ottimizzare il programma o riscriverlo in C.

Infatti lo strumento non sembra avere supporto per il controllo del
flusso [1] e quindi ti continua a mandare dati, anche se tu non sei in
grado di tenere il passo.


[1] http://en.wikipedia.org/wiki/Flow_control_(data)


Ciao  Manlio
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/

iEYEARECAAYFAlJO5YEACgkQscQJ24LbaUR0XACdEU8o4eM5NeoptWYoH3sA0t//
sPQAnRT42sZ3OU89L7YfxQEr6l+VU4E8
=fwE0
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-04 Per discussione Vittorio Spina



Ok, finalmente ho capito cosa intendi.

Il problema e' che sei troppo lento a leggere, e non ci puoi fare
niente a parte ottimizzare il programma o riscriverlo in C.

Infatti lo strumento non sembra avere supporto per il controllo del
flusso [1] e quindi ti continua a mandare dati, anche se tu non sei in
grado di tenere il passo.


[1] http://en.wikipedia.org/wiki/Flow_control_(data)


no, mi devi scusare, ma evidentemente mi sono spiegato male.
Mi collego a un laser con interfaccia ethernet. Io faccio i seguenti passi

1. apro il socket
2. leggo un B alla volta con recv(1) finchè non trovo la magic word
3. trovata la magic word leggo un po di bytes con dentro le
   informazioni fra cui, numero di scansione e numero di punti scansionati
4. con un ciclo leggo tanti pacchetti successivi all'header quanti sono
   i numeri scansionati
5. mostro i punti con pygame.

c'è un ritardo di circa 5 secondi cosa che nel suo viewer non c'è.
Leggendo i numeri di scansione mi accorgo che sono consequenziali senza 
salti, il laser cioè mi aspetta e accumulo un ritardo per la velocità 
del mio programma di visualizzazione.
se invece apro ogni volta che leggo il socket, va un po' a scatti perchè 
l'apertura del socket è cosa pesante, ma funziona, scattando un poco.
C'è che tu sappia un modo per dire al socket che il device server non 
deve aspettare? una maniera Non blocking?

il protocollo non c'entra nulla.
ciao

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-04 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 04/10/2013 18:09, Vittorio Spina wrote:
 
 Ok, finalmente ho capito cosa intendi.
 
 Il problema e' che sei troppo lento a leggere, e non ci puoi fare
 niente a parte ottimizzare il programma o riscriverlo in C.
 
 Infatti lo strumento non sembra avere supporto per il controllo 
 del flusso [1] e quindi ti continua a mandare dati, anche se tu 
 non sei in grado di tenere il passo.
 
 
 [1] http://en.wikipedia.org/wiki/Flow_control_(data)
 
 no, mi devi scusare, ma evidentemente mi sono spiegato male.

No, credo di aver capito, a parte alcuni dettagli.

 Mi collego a un laser con interfaccia ethernet. Io faccio i 
 seguenti passi
 
 1. apro il socket 2. leggo un B alla volta con recv(1) finch│ non 
 trovo la magic word 3. trovata la magic word leggo un po di bytes 
 con dentro le informazioni fra cui, numero di scansione e numero
 di punti scansionati

Quanti sono questi punti, come ordine di grandezza?

 4. con un ciclo leggo tanti pacchetti successivi all'header quanti 
 sono i numeri scansionati 5. mostro i punti con pygame.
 
 c'│ un ritardo di circa 5 secondi cosa che nel suo viewer non c'│.

Ritardo di 5 secondi rispetto a cosa e misurati come?

 Leggendo i numeri di scansione mi accorgo che sono consequenziali 
 senza salti, il laser cio│ mi aspetta e accumulo un ritardo per la 
 velocit¢ del mio programma di visualizzazione.

Che intendi con accumulare ritardo?
O meglio, come te ne accorgi?
Potrei capire se i dati letti sono dei frame video che devono essere
riprodotti sincronizzati, ma non mi sembra il tuo caso.

 se invece apro ogni volta che leggo il socket, va un po' a scatti 
 perch│ l'apertura del socket │ cosa pesante, ma funziona,
 scattando un poco. C'│ che tu sappia un modo per dire al socket che
 il device server non deve aspettare?

No, che io sappia.

In generale ti direi di riscrivere il programma in modo che sia piu'
efficiente.

 una maniera Non blocking? il protocollo non c'entra nulla. ciao
 

Ciao  Manlio

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/

iEYEARECAAYFAlJPACQACgkQscQJ24LbaUQ9xQCdHTSTGlYLTXRfhuKw7q8sjHkh
IBwAniLz9qUHutSlYXV/0fspUJBTR9C/
=qZFs
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] problema con socket (lettura blocking)

2013-10-04 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 04/10/2013 18:09, Vittorio Spina wrote:
 
 [...] C'│ che tu sappia un modo per dire al socket che il device
 server non deve aspettare? una maniera Non blocking? il protocollo
 non c'entra nulla.

Per farti capire come c'entra il protocollo vedi:
http://en.wikipedia.org/wiki/Software_flow_control

Ad esempio, su un sistema UNIX fai da terminale:

$cat /dev/urandom | strings

Ctrl+S (XOFF) mette in pausa il programma, e Ctrl+Q (XON)

Se il protocollo non permette il controllo del flusso, non ti resta
che chiudere la connessione ed aprirne un altra.


Nota che sia Ethernet prevede un meccanismo per il flow control,
http://en.wikipedia.org/wiki/Ethernet_flow_control

ma non credo si possa usare nel tuo caso.

E non sono nemmeno sicuro che serva a risolvere il tuo problema; il
controllo del flusso serve ad esempio se salvi i dati letti in un
buffer, e devi impedire che tale buffer cresca troppo.  Questo non mi
sembra sia il tuo caso.


Ciao  Manlio
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/

iEYEARECAAYFAlJPCxcACgkQscQJ24LbaUQ+GwCff1C4HSzFDz/yGaASHivQ1Zb5
hr8AniNzrwvus4dBFSBwcPmgvZBxCdK2
=5kY0
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python