¿Cómo lo hace un enhebrado.Thread produce el resto de su quantum en Python?


Tengo un hilo que está sondeando una pieza de hardware.

while not hardware_is_ready():
    pass
process_data_from_hardware()

Pero hay otros hilos (y procesos!) que podría tener cosas que hacer. Si es así, no quiero quemar la cpu comprobando el hardware cada otra instrucción. Ha pasado un tiempo desde que he tratado con el subproceso, y cuando lo hice no fue Python, pero creo que la mayoría de las bibliotecas de subprocesos tienen una función yield o algo que permite que un subproceso le diga al programador "Dale una oportunidad a los otros subprocesos."

while not hardware_is_ready():
    threading.yield()          # This function doesn't exist.
process_data_from_hardware()

Pero No puedo encontrar ninguna referencia a algo como esto en la documentación de threading. Python tiene una sentencia yield, pero estoy bastante seguro de que es algo completamente diferente (que tiene que ver con los generadores).

¿Qué es lo correcto hacer aquí?

Author: Tom Future, 2009-04-25

3 answers

time.sleep(0) es suficiente para controlar el rendimiento no no hay necesidad de usar un epsilon positivo. De hecho, time.sleep(0) SIGNIFICA "ceder a cualquier otro hilo que pueda estar listo".

 61
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-26 04:39:41

Lea el Bloqueo Global del Intérprete (GIL).

Por ejemplo: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

También: http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

Haga esto en su código si debe hacer Ocupado Esperando (por ejemplo, sondeando un dispositivo).

time.sleep( 0.0001 )

Esto dará lugar al planificador de subprocesos.

Además, he recopilado algunas notas y referencias en http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

 12
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-25 02:03:51

Si está haciendo esto en *nix, puede encontrar útil la biblioteca select. Kamaela también tiene algunos componentes que puede encontrar útiles, pero puede requerir un poco de un cambio de paradigma.

 3
Author: Jason Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-25 01:37:31