Hilo contra hilo

¿Cuál es la diferencia entre los módulos de threading y thread en Python?

En Python 3, el thread ha sido renombrado a _thread . Es un código de infraestructura que se utiliza para implementar el threading , y el código normal de Python no debería estar cerca de él.

_thread expone una vista bastante en bruto de los procesos de nivel de SO subyacentes. Esto casi nunca es lo que quieres, de ahí el cambio de nombre en Py3k para indicar que en realidad es solo un detalle de implementación.

threading agrega algunas cuentas automáticas adicionales, así como varias utilidades de conveniencia, todas las cuales lo convierten en la opción preferida para el código estándar de Python.

threading es solo un módulo de nivel superior que conecta el thread .

Vea aquí para los documentos de threading :

http://docs.python.org/library/threading.html

Si no me equivoco, el thread permite ejecutar una función como un subproceso independiente, mientras que con el threading debe crear una clase , pero obtener más funcionalidad.

EDIT: Esto no es precisamente correcto. módulo de threading proporciona diferentes formas de crear un hilo:

  • threading.Thread(target=function_name).start()
  • Cree una clase secundaria de threading.Thread con su propio método run() e inícielo

Hay otra biblioteca en Python que puede usarse para enhebrar y funciona perfectamente.

La biblioteca llamada concurrent.futures . Esto facilita nuestro trabajo.

Tiene para agrupación de hilos y agrupación de procesos .

Lo siguiente da una idea:

Ejemplo de ThreadPoolExecutor

 import concurrent.futures import urllib.request URLS = ['http://www.foxnews.com/', 'http://www.cnn.com/', 'http://europe.wsj.com/', 'http://www.bbc.co.uk/', 'http://some-made-up-domain.com/'] # Retrieve a single page and report the URL and contents def load_url(url, timeout): with urllib.request.urlopen(url, timeout=timeout) as conn: return conn.read() # We can use a with statement to ensure threads are cleaned up promptly with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: # Start the load operations and mark each future with its URL future_to_url = {executor.submit(load_url, url, 60): url for url in URLS} for future in concurrent.futures.as_completed(future_to_url): url = future_to_url[future] try: data = future.result() except Exception as exc: print('%r generated an exception: %s' % (url, exc)) else: print('%r page is %d bytes' % (url, len(data))) 

Otro ejemplo

 import concurrent.futures import math PRIMES = [ 112272535095293, 112582705942171, 112272535095293, 115280095190773, 115797848077099, 1099726899285419] def is_prime(n): if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True def main(): with concurrent.futures.ThreadPoolExecutor() as executor: for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): print('%d is prime: %s' % (number, prime)) if __name__ == '__main__': main() 

El módulo “Hilo” trata un hilo como una función, mientras que el módulo “Hilo” se implementa de forma orientada a objetos, es decir, cada hilo corresponde a un objeto.