19.2. Monitorizar la Entrada/Salida

Puedes comprobar si hay algo para leer o escribir a un fichero (bien a un fichero Python o a un fichero de más bajo nivel del Sistema Operativo) y automáticamente invocar una función. Ésto es especialmente útil para aplicaciones de red. La función:

  source_id = gobject.io_add_watch(source, condition, callback)
      

donde el primer argumento (source) es el fichero abierto (objeto de fichero de Python o descriptor de fichero de más bajo nivel) que quieres monitorizar. La función gobject.io_add_watch() usa internamente el descriptor de fichero de bajo nivel, pero la función lo podrá extraer usando el método fileno() cuando sea necesario. El segundo argumento (condition) especifica qué es lo que se quiere monitorizar. Puede ser cualquiera de:

  gobject.IO_IN - Llama a tu función cuando en el fichero hay datos disponibles para leer.

  gobject.IO_OUT - Llama a tu función cuando el fichero está listo para escritura.

  gobject.IO_PRI - Llama a tu función cuando el fichero tiene datos urgentes para leer.

  gobject.IO_ERR - Llama a tu función cuando se da una condición de error.

  gobject.IO_HUP - Llama a tu función cuando se ha producido un "cuelgue" (se ha roto la conexión, de uso para pipes y sockets generalmente).
      

Estas constantes se definen en el módulo gobject module. Supongo que ya te has dado cuenta que el tercer argumento, callback, es la función que quieres que se llame cuando las condiciones anteriores se cumplen.

El valor de retorno, source_id se puede usar para parar de monitorizar el fichero usando la siguiente función:

  gobject.source_remove(source_id)
      

Tu función será algo parecido a:

  def input_callback(source, condition):
      

donde source y condition son los que especificaste antes. El valor de source será el descriptor de fichero de bajo nivel y no el objeto fichero Python (es decir, el valor que devuelve el método de fichero de Python fileno()).

También se puede parar la monitorización devolviendo cero o FALSE (falso) desde tu función. Obviamente esto significa que si quieres que el monitorización se siga llamando, debes devolver un valor distinto de cero, como TRUE (verdadero).