Quelle est la différence entre les modules threading
et thread
en Python?
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.
threading
est juste un module de niveau supérieur qui interface thread
.
Voir ici pour les documents threading
:
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()
threading.Thread
Avec votre propre méthode run()
et démarrez-laIl 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()