Re: [Python] problema con socket (lettura blocking)
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)
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)
-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)
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)
-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)
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)
-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)
-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