web-dev-qa-db-fra.com

Thread vs Threading

Quelle est la différence entre les modules threading et thread en Python?

58
banx

Dans Python 3, thread a été renommé _thread. C'est le code d'infrastructure qui est utilisé pour implémenter threading, et le code normal Python ne devrait pas aller n'importe où près de lui).

_thread expose une vue assez brute des processus sous-jacents au niveau du système d'exploitation. Ce n'est presque jamais ce que vous voulez, d'où le renommage dans Py3k pour indiquer qu'il s'agit vraiment d'un détail d'implémentation.

threading ajoute une comptabilité automatique supplémentaire, ainsi que plusieurs utilitaires pratiques, ce qui en fait l'option préférée pour le code standard Python.

77
ncoghlan

threading est juste un module de niveau supérieur qui interface thread.

Voir ici pour les documents threading:

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

27
Mike Lewis

Si je ne me trompe pas, thread vous permet d'exécuter une fonction en tant que thread séparé, alors qu'avec threading vous devoir créez un classe, mais obtenez plus de fonctionnalités.

EDIT: Ce n'est pas précisément correct. Le module threading propose différentes manières de créer un thread:

  • threading.Thread(target=function_name).start()
  • Créez une classe enfant de threading.Thread Avec votre propre méthode run() et démarrez-la
11
Oleh Prypin

Il existe une autre bibliothèque dans Python qui peut être utilisée pour le filetage et fonctionne parfaitement.

La bibliothèque appelée concurrent.futures . Cela facilite notre travail.

Il a pour pool de threads et pool de processus .

Ce qui suit donne un aperçu:

Exemple 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)))

Un autre exemple

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 __== '__main__':
    main()
0
Jeril