Há muito tempo atrás, escrevi uma teia de aranha que multithread para permitir que solicitações simultâneas ocorressem ao mesmo tempo. Isso foi na minha juventude em Python, nos dias antes de eu conhecer o GIL e os problemas associados que ele cria para o código multithread (IE, na maioria das vezes, as coisas acabam sendo serializadas!) ...
Gostaria de refazer esse código para torná-lo mais robusto e com melhor desempenho. Existem basicamente duas maneiras de fazer isso: eu poderia usar o novo módulo de multiprocessamento no 2.6+ ou eu poderia usar algum modelo baseado em reator / evento. Prefiro fazer o mais tarde, pois é muito mais simples e menos propenso a erros.
Portanto, a pergunta se refere a qual estrutura seria mais adequada às minhas necessidades. A seguir, é apresentada uma lista das opções que eu conheço até agora:
- Twisted : O avô das estruturas dos reatores Python: parece complexo e um pouco inchado. Curva de aprendizado acentuada para uma pequena tarefa.
- Eventlet : Dos caras do lindenlab . Estrutura baseada em greenlet voltada para esse tipo de tarefa. No entanto, dei uma olhada no código e não é muito bonito: não compatível com o pep8, repleto de impressões (por que as pessoas fazem isso em uma estrutura !?), a API parece um pouco inconsistente.
- PyEv : Imaturo, parece não haver ninguém usando agora, embora seja baseado no libevent, por isso possui um back-end sólido.
- asyncore : A partir do stdlib: über de baixo nível, parece ser muito trabalho braçal apenas para tirar algo do chão.
- tornado : Embora seja um produto orientado ao servidor, projetado para servidores de sites dinâmicos, ele possui um cliente HTTP assíncrono e um ioloop simples . Parece que poderia fazer o trabalho, mas não para o que se destinava. [editar: infelizmente, não roda no Windows, o que é importante para mim - é um requisito para eu apoiar esta plataforma fraca]
Há algo que eu perdi? Certamente deve haver uma biblioteca por aí que se encaixe no ponto ideal de uma biblioteca de rede assíncrona simplificada!
[editar: grandes agradecimentos a intgr por seu ponteiro para esta página . Se você rolar até o final, verá uma lista muito boa de projetos que visam realizar essa tarefa de uma maneira ou de outra. Parece que as coisas realmente mudaram desde o início do Twisted: as pessoas agora parecem preferir uma solução baseada em rotina ao invés de uma solução tradicional orientada a reatores / retornos de chamada. Os benefícios dessa abordagem são um código mais claro e direto: eu certamente encontrei no passado, especialmente ao trabalhar com o boost.asioem C ++, esse código baseado em retorno de chamada pode levar a designs difíceis de seguir e relativamente obscuros para quem não é treinado. O uso de co-rotinas permite escrever um código que pareça um pouco mais síncrono. Acho que agora minha tarefa é descobrir qual dessas muitas bibliotecas eu gosto da aparência e experimentar! Ainda bem que perguntei agora ...]
[editar: talvez seja de interesse para quem seguiu ou tropeçou nessa questão ou se preocupa com esse tópico em qualquer sentido: eu encontrei uma excelente descrição do estado atual das ferramentas disponíveis para este trabalho]
select
para a multiplexação de E / S. Mas você deve conseguir obter um desempenho decente com o tornado-pyuv . 2. Agora existe assíncrono no Python 3.3+ e seu trollius de backport, que permite executar qualquer aplicativo Tornado em seu loop de eventos (o Twisted será suportado em breve).