A partire da Python 3.2, è possibile utilizzare,per l'avvio di attività parallele.
Partenza questo ThreadPoolExecutor
esempio:
http://docs.python.org/dev/library/concurrent.futures.html#threadpoolexecutor-example
Si genera discussioni per recuperare HTML e agisce sulle risposte non appena vengono ricevute.
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):
conn = urllib.request.urlopen(url, timeout=timeout)
return conn.readall()
# 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)))
L'esempio precedente utilizza la filettatura. V'è anche una simile ProcessPoolExecutor
che utilizza un pool di processi, piuttosto che le discussioni:
http://docs.python.org/dev/library/concurrent.futures.html#processpoolexecutor-example
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):
conn = urllib.request.urlopen(url, timeout=timeout)
return conn.readall()
# 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)))
Overkill di strada. Tutto ciò di cui ho bisogno sono le chiamate http simultanee da uno script (non ho bisogno di chiamare un processo dalla riga di comando, ecc.). Ho semplicemente bisogno di avere funzionalità di callback, ma non riesco a trovare il processo per questo in Python. Ulteriori ricerche mi stanno portando verso urllib2. – kasceled
Overkill? I thread non hanno nulla a che fare con i processi di chiamata dalla riga di comando. – Falmarri
tippytop, sì ovviamente urllib2 per il trasporto .. ma hai ancora bisogno di generarli in parallelo. così puoi fare threading, multiprocessing, concurrent.futures o una soluzione basata su asynch i/o. –