O que é um pool de threads?

62

Como alguém implementaria um pool de threads? Eu tenho lido na wikipedia por "threadpool", mas ainda não consigo descobrir o que fazer para resolver esta questão (possivelmente porque eu não entendi direito o que é um threadpool em termos simples).

Alguém pode me explicar em inglês simples o que é um pool de threads e como alguém responderia a essa pergunta?

John Smith
fonte

Respostas:

96

Um conjunto de encadeamentos é um grupo de encadeamentos inativos pré-instanciados, prontos para receber trabalho. Eles são preferidos à instanciação de novos encadeamentos para cada tarefa quando há um grande número de tarefas curtas a serem executadas, em vez de um pequeno número de tarefas longas. Isso evita a sobrecarga de criação de um encadeamento várias vezes.

A implementação varia de acordo com o ambiente, mas em termos simplificados, você precisa do seguinte:

  • Uma maneira de criar threads e mantê-los em um estado ocioso. Isso pode ser feito fazendo com que cada encadeamento espere em uma barreira até que a piscina entregue o trabalho. (Isso também pode ser feito com mutexes.)
  • Um contêiner para armazenar os encadeamentos criados, como uma fila ou qualquer outra estrutura que possua uma maneira de adicionar um encadeamento ao pool e puxar um para fora.
  • Uma interface padrão ou classe abstrata para os threads usarem no trabalho. Pode ser uma classe abstrata chamada Taskcom um execute()método que faz o trabalho e depois retorna.

Quando o conjunto de encadeamentos é criado, ele instancia um certo número de encadeamentos para disponibilizar ou cria novos conforme necessário, dependendo das necessidades da implementação.

Quando o pool é entregue a Task, ele pega um fio do contêiner (ou espera que um fique disponível se o contêiner estiver vazio), entrega um Taske encontra a barreira. Isso faz com que o encadeamento ocioso retome a execução, invocando o execute()método Taskfornecido. Quando a execução é concluída, o encadeamento volta ao pool para ser reutilizado e depois encontra sua barreira, adormecendo até o ciclo se repetir.

Blrfl
fonte
19
Um conjunto de encadeamentos é um grupo de encadeamentos inativos pré-instanciados, prontos para receber trabalho. [...] Isso evita a sobrecarga da criação de um encadeamento várias vezes. - isto deve ser cuspido pelo Google sempre que alguém procura por "pool de threads"
Rafael Eyng
A criação do conjunto de encadeamentos envolve barreira internamente? Você pode compartilhar referências nessas linhas?
overexchange
@overexchange Não, não. Minha referência a essa pergunta foi como um exemplo de uma maneira melhor de reescrever sua pergunta sobre barreira . (Se você fizer isso, vou escrever uma resposta.)
Blrfl
uma das melhores respostas curtas.
Blood-HaZaRd 01/08/1918
10

O conjunto de encadeamentos é uma coleção de encadeamentos gerenciados normalmente organizados em uma fila, que executam as tarefas na fila de tarefas.

Criar um novo objeto de encadeamento sempre que você precisar que algo seja executado de forma assíncrona é caro. Em um conjunto de encadeamentos, você apenas adicionaria as tarefas que deseja executar de forma assíncrona à fila de tarefas, e o conjunto de encadeamentos atribui um encadeamento disponível, se houver, à tarefa correspondente. Assim que a tarefa é concluída, o encadeamento agora disponível solicita outra tarefa (assumindo que ainda resta).

O pool de threads ajuda a evitar a criação ou destruição de mais threads do que seria realmente necessário.

Eu começaria criando uma classe com uma fila de threads e uma fila de tarefas. Em seguida, implemente um método que adicione uma tarefa à fila de tarefas e prossiga a partir daí. Obviamente, você também deve permitir definir o máximo de encadeamentos permitidos em um conjunto de encadeamentos.

Dante
fonte
1

No aplicativo multithread, o pool de threads é um "pool de threads disponíveis" que pode ser usado pelo seu aplicativo. Geralmente, por exemplo, .NET, tudo é gerenciado, então você apenas atribui tarefas e, quando um thread estiver livre, ele será executado. Portanto, para implementar um pool de threads, eu esperaria criar um conceito em que as tarefas sejam executadas automaticamente por threads livres, sem a criação explícita de threads para cada tarefa.

PTS
fonte
1

Exemplo da vida real;

  1. Instalação: Sistema operacional
  2. Seções: Aplicações
  3. Pessoas: Threads

Você tem uma instalação lá 12 pessoas estão trabalhando. Existem 3 seções desta instalação. Cozinha, banheiros e segurança. Se você não usar a técnica de pool de encadeamentos, é assim que funciona: todas as 12 pessoas estarão em pé em uma sala de reuniões; se novos clientes chegarem e solicitarem tarefas, você separará as pessoas em grupos e as enviará para fazer seu trabalho. e volte para a sala de reuniões. Mas, antes que cumpram seu dever, há uma fase de preparação. Eles precisam usar uniforme correto, equipar determinados dispositivos e caminhar até essa seção, terminar o trabalho e voltar. Assim, toda vez que terminam seu trabalho (fim de linha), eles precisam voltar para a sala de reuniões, despir o uniforme, retirar o equipamento e aguardar o próximo trabalho. Referem-se à criação de contexto de encadeamento, é alocação de memória e informações de rastreamento pelo SO.

Se você estiver usando o pool de threads, no início da manhã, designará 6 pessoas para a cozinha, 2 para o banheiro e 4 para a segurança. Então, eles só farão sua preparação uma vez por dia. Mesmo se não houver clientes na cozinha, essas quatro pessoas estarão lá, ociosas, para quaisquer tarefas futuras. Eles não precisam voltar para a sala de reuniões até a cozinha fechar (o aplicativo termina). Essas 4 pessoas estão no pool de aplicativos de cozinha e prontas para servir rapidamente. Mas você não pode prometer que eles estão trabalhando o dia todo, pois a cozinha pode ficar ociosa de vez em quando. A mesma lógica se aplica a banheiros e segurança também.

No primeiro cenário, você não desperdiça nenhum encadeamento para nenhuma tarefa, mas levará um bom tempo para preparar cada encadeamento único para cada tarefa. No segundo, você prepara os threads com antecedência, para não garantir que estará usando todos os threads para todas as tarefas, mas o SO faz uma ótima otimização, para que você possa confiar com segurança.

Teoman shipahi
fonte