Módulo Threading do Python
O módulo threading permite executar várias threads no mesmo processo e coordená-las com locks.
import threading
Threads são úteis quando se espera por E/S, como requisições de rede ou operações de arquivo. Normalmente não são a melhor forma de acelerar código Python pesado em CPU.
Iniciando uma thread
import threading
def worker():
print('working')
thread = threading.Thread(target=worker)
thread.start()
thread.join()
working
start() inicia a thread. join() espera que ela termine antes de continuar o programa principal.
Passando argumentos
import threading
def greet(name):
print(f'hello {name}')
thread = threading.Thread(target=greet, args=('Ada',))
thread.start()
thread.join()
hello Ada
Use args para argumentos posicionais e kwargs para argumentos nomeados.
Usando um lock
Locks ajudam a proteger estado compartilhado.
import threading
counter = 0
lock = threading.Lock()
with lock:
counter += 1
print(counter)
1
Executando várias threads
import threading
results = []
lock = threading.Lock()
def worker(number):
with lock:
results.append(f'worker {number}')
threads = []
for number in range(3):
thread = threading.Thread(target=worker, args=(number,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print(sorted(results))
['worker 0', 'worker 1', 'worker 2']
A ordem real de conclusão pode variar porque as threads rodam em paralelo, então este exemplo ordena o resultado antes de imprimir.