Il giorno 15/lug/07, alle ore 23:38, allanon ha scritto:

Sun 15 July 2007, alle 16:47 +0200, Eriol ha scritto:
On Friday 13 July 2007, allanon wrote:
come potrei fare?

Importare dal modulo threading:

from threading import Timer


ti ringrazio per la dritta,
infatti ho altre due domande per te :)


Rispondo io, va bene lo stesso? ;-)

1) come diavolo fai a saperlo dato che nella pagine online di reference
non c'e' scritto :p


Sa leggere la documentazione ;-)

http://www.python.org/doc/current/lib/module-threading.html

2)

questa e' la parte incriminata del mio codice

if __name__ == '__main__':
# creo l'oggetto database
   db = MySQLdb.connect(host = HOST,
      user = USER,
      passwd = PASSWD,
      db=DATABASE
      )
   c=db.cursor() # crea il cursore
   t = Timer(5.0, Repeated_Function(c))
   t.start()


lancio lo script,
viene eseguita la Repeated_Function per 1 volta
dopo 5 secondi ottengo questo errore

Traceback (most recent call last):
  File "threading.py", line 442, in __bootstrap
    self.run()
  File "threading.py", line 607, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable


la connessione al db dovrebbe essere sempre attiva giusto?
e lo stesso dovrebbe valere per il cursore,
non capisco cosa non funziona O_O


Stai passando al timer il valore di ritorno della *chiamata* alla funzione. In questo modo, la funzione Repeated_Function viene chiamata subito, e al timer viene passato il suo valore di ritorno (nel tuo caso l'oggetto None). Questo ti spiega il messaggio d'errore. La riga giusta dovrebbe essere qualcosa di simile (passi il nome della funzione e una sequenza dei suoi parametri):

t = Timer(5.0, Repeated_Function, (c,))

Tieni presente che comunque il timer è one-shot, ovvero se vuoi che venga eseguita *ogni 5 secondi* devi ri-schedulare (che brutto termine!) l'azione dopo che è stata eseguita. Questo se ti serve che il tuo programma continui a funzionare durante i 5 secondi di attesa, in caso contrario la cosa più semplice è quella di seguito.

il mio intento e' quello di lasciare sempre aperta una connessione
e di rinnovare solo la query ogni tot secondi


In tal caso (ovvero se devi solo eseguire la query ogni 5 secondi, senza fare niente nel frattempo), il codice più corretto dovrebbe essere qualcosa tipo:

import time

while True:
    # Esegue la query o qualunque cosa
    ...
    time.sleep(5)       # Attende 5 secondi

Oppure usare il modulo sched, che è fatto proprio per questo genere di cose.

Nel caso in cui l'esecuzione del tuo programma deve proseguire durante l'attesa, puoi anche provare a dare un'occhiata a Twisted, che per queste cose ti da molta potenza "a basso costo" (è piuttosto semplice in casi del genere)

--
Antonio Valente


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

Rispondere a