Thread Pool
Em Python, você pode usar um thread pool para executar tarefas concorrentemente usando um conjunto predefinido de threads. O benefício de usar um thread pool é que ele evita a sobrecarga de criar e destruir threads para cada tarefa, o que pode melhorar o desempenho.
O módulo concurrent.futures do Python fornece uma classe ThreadPoolExecutor que permite criar um pool de threads e submeter tarefas. Aqui está um exemplo:
Crie um projeto chamado thread_pool_range.py no WebIDE e insira o seguinte conteúdo.
import concurrent.futures
## Define a function to be executed in multiple threads with two arguments
def my_func(arg1, arg2):
## Define the tasks performed by the thread here
print(f"Hello from my thread with args {arg1} and {arg2}")
## Create a ThreadPoolExecutor object with a maximum of 5 worker threads
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
## Submit each task (function call with its arguments) to the executor for processing in a separate thread
## The submit() method returns a Future object representing the result of the asynchronous computation
for i in range(10):
executor.submit(my_func, i, i+1)
Neste exemplo, definimos uma função my_func que recebe dois argumentos. Criamos um ThreadPoolExecutor com um máximo de 5 threads de trabalho. Em seguida, iteramos por uma faixa de números e submetemos tarefas ao thread pool usando o método executor.submit(). Cada tarefa submetida é executada em um dos threads de trabalho disponíveis.
Dicas: O objeto ThreadPoolExecutor é usado como um gerenciador de contexto. Isso garante que todos os threads sejam limpos adequadamente quando o código dentro do bloco with for concluído.
Use o seguinte comando para executar o script.
python thread_pool_range.py
O método submit() retorna um objeto Future imediatamente, representando o resultado da tarefa submetida. Você pode usar o método result() do objeto Future para recuperar o valor de retorno da tarefa. Se a tarefa lançar uma exceção, chamar result() lançará essa exceção.
Você também pode usar o método map() da classe ThreadPoolExecutor para aplicar a mesma função a uma coleção de itens. Por exemplo, crie um projeto chamado thread_pool_map.py no WebIDE e insira o seguinte conteúdo:
import concurrent.futures
## Define a function to be executed in multiple threads
def my_func(item):
## Define the tasks performed by the thread here
print(f"Hello from my thread with arg {item}")
## Create a list of items to be processed by the threads
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
## Create a ThreadPoolExecutor object with a maximum of 5 worker threads
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
## Submit each item to the executor for processing in a separate thread
## The map() method automatically returns the results in order
executor.map(my_func, items)
Neste exemplo, definimos uma função my_func que recebe um argumento. Criamos uma lista de itens e os submetemos ao thread pool usando o método executor.map(). Cada item na lista é passado para my_func como um argumento, e cada item é executado em um dos threads de trabalho disponíveis.
Use o seguinte comando para executar o script.
python thread_pool_map.py
Os resultados obtidos de thread_pool_range.py e thread_pool_map.py são os mesmos.