Uma boa abordagem para solucionar esse problema é primeiro escrever o código necessário para obter um resultado e incorporar o código de segmentação para paralelizar o aplicativo.
Em um mundo perfeito, isso significaria simplesmente iniciar simultaneamente 100.000 threads que produzem seus resultados em um dicionário ou lista para processamento posterior, mas na prática você está limitado em quantas solicitações HTTP paralelas você pode emitir dessa maneira. Localmente, você tem limites em quantos soquetes pode abrir simultaneamente, quantos threads de execução o seu interpretador Python permitirá. Remotamente, você pode estar limitado no número de conexões simultâneas se todas as solicitações forem contra um servidor ou muitos. Essas limitações provavelmente exigirão que você escreva o script de forma a pesquisar apenas uma pequena fração dos URLs a qualquer momento (100, como outro pôster mencionado, é provavelmente um tamanho decente do conjunto de encadeamentos, embora você possa achar que pode implantar com sucesso muito mais).
Você pode seguir este padrão de design para resolver o problema acima:
- Inicie um encadeamento que inicie novos encadeamentos de solicitação até que o número de encadeamentos em execução no momento (você pode rastreá-los via threading.active_count () ou empurrando os objetos de encadeamento para uma estrutura de dados) seja> = seu número máximo de solicitações simultâneas (digamos 100) , depois dorme por um curto tempo limite. Esse encadeamento deve terminar quando não houver mais URLs para processar. Assim, o encadeamento continuará acordando, iniciando novos encadeamentos e dormindo até que você termine.
- Faça com que os threads de solicitação armazenem seus resultados em alguma estrutura de dados para recuperação e saída posteriores. Se a estrutura na qual você está armazenando os resultados for um
list
ou dict
no CPython, você poderá anexar ou inserir com segurança itens exclusivos de seus encadeamentos sem bloqueios , mas se gravar em um arquivo ou precisar de uma interação de dados entre encadeamentos mais complexa, use um bloqueio de exclusão mútua para proteger esse estado da corrupção .
Eu sugiro que você use o módulo de segmentação . Você pode usá-lo para iniciar e rastrear threads em execução. O suporte de encadeamento do Python é simples, mas a descrição do seu problema sugere que ele é completamente suficiente para suas necessidades.
Finalmente, se você gostaria de ver uma aplicação direta bonita de um aplicativo de rede paralela escrito em Python, veja ssh.py . É uma pequena biblioteca que usa o Python threading para paralelizar muitas conexões SSH. O design está próximo o suficiente de seus requisitos, para que você possa ser um bom recurso.