Pergunta

Existem muitas questões relacionadas com Stackless Python. Mas nenhuma resposta a esta minha pergunta, eu acho que (me corrigir se errado - por favor). Há algum buzz sobre ele o tempo todo, então eu curioso para saber. O que eu iria usar Stackless para? Como é que é melhor do que CPython?

Sim, tem fios verdes (stackless) que permitem criar rapidamente muitas linhas leves, desde que nenhuma operação for de bloqueio (algo como tópicos de Ruby?). O que é este grande para? Que outras características que ele tem que eu quero usar mais de CPython?

Foi útil?

Solução

Ele permite que você trabalhar com grandes quantidades de concorrência. Ninguém em sã consciência iria criar cem mil threads do sistema, mas você pode fazer isso usando stackless.

testes este artigo fazendo exatamente isso, criando cem mil tasklets tanto em Python e Google Go (uma nova linguagem de programação): http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

Surpreendentemente, mesmo que o Google Go é compilado para código nativo, e eles tout sua implementação co-rotinas, Python ainda ganha.

Stackless seria bom para a implementação de um mapa / reduzir algoritmo, onde você pode ter um número muito grande de redutores de acordo com os dados de entrada.

Outras dicas

principal benefício do Stackless Python é o suporte para coroutines muito leves. não CPython não suporta nativamente coroutines (apesar de eu esperar que alguém para deixar um corte à base de gerador nos comentários) para Stackless é uma clara melhoria em CPython quando você tem um problema que beneficia de co-rotinas.

Acho que a principal área onde eles se destacam são quando você tem muitas tarefas simultâneas em execução dentro de seu programa. Exemplos disso podem ser entidades de jogo que executar um script looping para a sua AI, ou um servidor web que está atendendo muitos clientes com páginas que são lentos para criar.

Você ainda tem muitos dos problemas típicos com exatidão a simultaneidade no entanto sobre dados compartilhados, mas a alternância de tarefas determinista torna mais fácil escrever código seguro, pois você sabe exatamente onde o controle será transferido e, portanto, conhecer os pontos exatos em que o compartilhados estado deve estar em dia.

Thirler já mencionou que stackless foi usado em Eve Online. Tenha em mente, que:

(..) stackless adiciona um toque ainda mais para isso, permitindo que as tarefas sejam separados em tarefas menores, tasklets, que pode então ser separado do programa principal para executar por conta própria. Isso pode ser usado para o fogo-e-esqueça tarefas, como o envio de fora de um email, ou despachar um evento, ou para operações de IO, por exemplo, envio e recebimento de pacotes de rede. Uma espera tasklet para um pacote a partir da rede, enquanto outros continuam a executar o loop de jogo.

É de certa forma como threads, mas não é preventivo e explicitamente prevista, por isso há menos problemas com sincronização. Além disso, a alternância entre tasklets é muito mais rápido do que troca de thread, e você pode ter um grande número de tasklets ativos enquanto o número de threads é severamente limitada pelo hardware do computador.

(tenho essa citação de aqui )

No PyCon 2009 não foi dado uma conversa muito interessante , descrevendo por que e como Stackless é usado pelo CCP Games.

Além disso, há uma muito boa material introdutório, que descreve por stackless é uma boa solução para suas aplicações. (Pode ser um pouco velho, mas acho que vale a pena leitura).

Eve Online é largamente programado em Stackless Python. Eles têm vários blogs dev sobre o uso dele. Parece que é muito útil para computação de alto desempenho.

Enquanto eu não usei si Stackless, tenho usado Greenlet para a implementação de aplicações de rede altamente simultâneos. Alguns dos casos de uso Linden Lab tem colocá-lo para são: proxies de alto desempenho inteligentes, um sistema rápido para distribuir comandos mais de um grande número de máquinas, e um aplicativo que faz uma tonelada de gravações de banco de dados e lê (na proporção de cerca de 1 : 2, que é muito escrever-pesado, por isso é passar a maior parte de seu tempo de espera para o banco de dados para retorno), e um-crawler-type-coisa web para dados de web internos. Basicamente, qualquer aplicativo que está esperando para ter que fazer um monte de rede I / O irá beneficiar de ser capaz de criar um bajillion tópicos leves. se 10.000 clientes conectados não parecer um grande negócio para mim.

Stackless ou Greenlet não são realmente uma solução completa, no entanto. Eles são muito baixo nível e você vai ter que fazer um monte de monkeywork para construir uma aplicação com os que usa-los ao máximo. Eu sei disso porque eu manter uma biblioteca que fornece uma camada de rede e programação em cima de Greenlet, especificamente porque escrever aplicativos é muito mais fácil com ele. Há um monte desses agora; I manter Eventlet, mas também há Concurrence, quiral e, provavelmente, um pouco mais que eu não sei sobre.

Se o tipo de aplicativo que você deseja sons escrever como o que escrevi sobre, considere uma dessas bibliotecas. A escolha de Stackless vs Greenlet é um pouco menos importante do que decidir o que melhor se adequa à biblioteca as necessidades do que você quer fazer.

A utilidade básica para tópicos verdes, a forma como eu vejo, é implementar um sistema em que você tem uma grande quantidade de objetos que fazem operações de alta latência. Um exemplo concreto seria comunicar com outras máquinas:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

Threads deixar você escrever o código acima, naturalmente, mas se o número de objetos é grande o suficiente, tópicos só não pode realizar de forma adequada. Mas você pode usar tópicos verdes mesmo para realmente em grandes quantidades. O request_information() acima poderia mudar para algum programador onde outro trabalho está esperando e voltar mais tarde. Você recebe todos os benefícios de ser capaz de chamar de "bloqueio" funções como se retornar imediatamente sem o uso de fios.

Esta é, obviamente, muito útil para qualquer tipo de computação distribuída, se você quiser escrever código de uma maneira simples.

Também é interessante para múltiplos núcleos para mitigar à espera de bloqueios:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

A função green_lock seria basicamente tentar adquirir o bloqueio e apenas mudar para um programador principal se ele falhar devido a outros núcleos usando o objeto.

Mais uma vez, fios verdes estão sendo usados ??para mitigar o bloqueio, permitindo que o código a ser escrito naturalmente e ainda um bom desempenho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top