Como alguém implementaria um threadpool? Estive lendo na wikipedia sobre “threadpool”, mas ainda não consigo descobrir o que se deve fazer para resolver essa questão (possivelmente porque não entendi muito bem o que é um threadpool em termos simples).
Alguém pode me explicar em inglês simples o que é um threadpool e como responder a esta pergunta?
Resposta
Um thread pool é um grupo de encadeamentos ociosos pré-instanciados que estão prontos para receber trabalho. Eles são preferidos em vez de instanciar novos encadeamentos para cada tarefa quando há um grande número de tarefas curtas a serem feitas em vez de um pequeno número de longas. Isso evita ter que incorrer na sobrecarga de criar um encadeamento um grande número de vezes.
A implementação irá variar 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 thread espere em uma barreira até que o pool funcione. (Isso pode ser feito com mutexes também.)
- Um contêiner para armazenar os encadeamentos criados, como uma fila ou qualquer outra estrutura que tenha uma maneira de adicionar um encadeamento ao pool e retirá-lo.
- Uma interface padrão ou classe abstrata para os threads usarem no trabalho. Pode ser uma classe abstrata chamada
Task
com um métodoexecute()
que faz o trabalho e retorna.
Quando o pool de threads é criado, ele irá instanciar um certo número de threads para disponibilizar ou criar novos conforme necessário, dependendo das necessidades da implementação.
Quando o pool é entregue a Task
, pega um thread do contêiner (ou espera que um fique disponível se o contêiner estiver vazio), entrega um Task
e encontra a barreira. Isso faz com que a thread inativa retome a execução, invocando o método execute()
do Task
que foi fornecido. Assim que a execução for concluída, o thread se devolve ao pool para ser colocado no contêiner para reutilização e, em seguida, encontra sua barreira, adormecendo até que o ciclo se repita.
Comentários
- Um pool de threads é um grupo de threads inativos pré-instanciados que estão prontos para receberem trabalho. […] Isso evita ter que incorrer na sobrecarga de criar um tópico um grande número de vezes. – isso deve ser cuspido pelo Google sempre que alguém pesquisa por ” tópico pool ”
- A criação do pool de threads envolve barreira internamente? Você pode compartilhar referências, nessas linhas?
- @overexchange Não, não pode. Minha referência a esta pergunta foi como um exemplo de uma maneira melhor de reescrever sua pergunta barreira . (Se o fizer, escreverei uma resposta.)
- uma das melhores respostas curtas.
Resposta
O pool de threads é uma coleção de threads gerenciados geralmente organizados em uma fila, que executam as tarefas na fila de tarefas.
Criar um novo objeto de thread toda vez que você precisa que algo seja executado de forma assíncrona é caro. Em um pool de threads, você apenas adicionaria as tarefas que deseja executar de forma assíncrona à fila de tarefas e o pool de threads se encarrega de atribuir uma thread disponível, se houver, para a tarefa correspondente. Assim que a tarefa for concluída, o thread agora disponível solicita outra tarefa (assumindo que ainda haja alguma).
O pool de threads ajuda a evitar a criação ou destruição de mais threads do que o realmente necessário.
Eu começaria criando uma classe com uma fila de tópicos e uma fila de tarefas. Em seguida, implemente um método que adiciona uma tarefa à fila de tarefas e prossiga a partir daí. Obviamente, você também deve possibilitar definir o máximo de threads permitidas em um pool de threads.
Resposta
Exemplo da vida real;
- Facilidade: Sistema operacional
- Seções: Aplicativos
- Pessoas: Threads
Você tem uma facilidade lá 12 pessoas estão trabalhando. Existem 3 seções desta facilidade. Cozinha, banheiros e segurança. Se você não usar a técnica de pool de threads, é assim que funciona: todas as 12 pessoas estarão em uma sala de reuniões, se novos clientes vierem pela instalação e pedirem tarefas, então você separará as pessoas em grupos e os enviará para fazer seu trabalho, e voltar para a sala de reunião. Mas, antes de irem para o trabalho, há uma fase de preparação. Eles precisam vestir o uniforme correto, equipar alguns aparelhos e caminhar até aquele setor, terminar o trabalho e voltar. Então, uma vez cada vez que terminam seu trabalho (encadeamento termina), eles precisam voltar para a sala de reunião, despir o uniforme, retirar o equipamento e esperar pelo próximo trabalho. Estes se referem à criação de contexto de encadeamento, sua alocação de memória e informações de rastreamento por sistema operacional.É muito demorado para o sistema operacional reorganizar as novas necessidades de thread.
Se você estiver usando o pool de threads, então, no início da manhã, designará 6 pessoas para a cozinha, 2 pessoas para o banheiro e 4 pessoas para segurança. Portanto, eles farão a preparação apenas uma vez ao dia. Mesmo que não haja clientes na cozinha, essas 4 pessoas estarão lá, paradas, para qualquer tarefa futura. Eles não precisam voltar para a sala de reunião até que a cozinha feche (o aplicativo termina). Essas 4 pessoas estão no pool de aplicativos do Kitchen e prontas para servir rapidamente. Mas, você não pode prometer que eles estão trabalhando o dia todo, uma vez que 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 para cada tarefa. No segundo, você prepara os threads com antecedência, então você não pode garantir que usará todos os threads para todas as tarefas, mas o sistema operacional faz uma ótima otimização nele, para que você possa confiar nele com segurança.
Resposta
Em aplicativos multithread, pool de threads é um “pool de threads disponíveis” que pode ser usado por seu aplicativo. Normalmente, por exemplo .NET, é tudo gerenciado, então você apenas atribui tarefas e uma vez que um thread está livre, ele vai executá-lo. Portanto, para implementar um threadpool, eu esperaria criar um conceito em que as tarefas são executadas automaticamente por threads livres sem a criação explícita de thread para cada tarefa.