Como tópicos trabalhar em Python, e quais são as armadilhas comuns específicas-threading Python?

votos
74

Eu tenho tentado envolver minha cabeça em torno de como tópicos trabalhar em Python, e é difícil encontrar boas informações sobre como eles funcionam. I pode apenas estar faltando um link ou algo assim, mas parece que a documentação oficial não é muito completo sobre o assunto, e eu não tenho sido capaz de encontrar um bom write-up.

Do que eu posso dizer, apenas um thread pode estar em execução ao mesmo tempo, ea linha ativa muda a cada 10 instruções ou assim?

Onde há uma boa explicação, ou você pode fornecer um? Também seria muito bom estar ciente dos problemas comuns que você executar em enquanto estiver usando tópicos com Python.

Publicado 28/08/2008 em 00:44
fonte usuário
Em outras línguas...                            


7 respostas

votos
46

Sim, por causa da Global Interpreter Lock (GIL) só pode executar um thread por vez. Aqui estão alguns links com alguns insights sobre este:

Desde o último elo de uma citação interessante:

Deixe-me explicar o que tudo isso significa. Fios executado no interior da mesma máquina virtual, e, portanto, são executados no mesmo equipamento físico. Os processos podem ser executados na mesma máquina física ou em outro aparelho físico. Se você arquiteta sua aplicação em torno de tópicos, você não fez nada para acessar várias máquinas. Assim, você pode escalar a tantos núcleos estão na única máquina (que será muito poucos ao longo do tempo), mas para realmente chegar escalas web, você terá que resolver o problema de várias máquinas de qualquer maneira.

Se você quiser usar multi core, pyprocessing define uma API baseada processo para fazer a paralelização real. O PEP também inclui algumas referências interessantes.

Respondeu 28/08/2008 em 01:19
fonte usuário

votos
35

Python é uma linguagem bastante fácil de enfiar dentro, mas há ressalvas. A maior coisa que você precisa saber sobre o Global Interpreter Lock. Isso permite que apenas um segmento para acessar o intérprete. Isso significa duas coisas: 1) você raramente encontrar-se com uma declaração de bloqueio em python e 2) se você quer tirar proveito de sistemas multi-processador, você tem que usar processos separados. EDIT: Eu também de salientar que você pode colocar algum código em C / C ++, se você deseja obter em torno da GIL também.

Assim, você precisa re-considerar por que você quer usar threads. Se você quiser paralelizar seu aplicativo para tirar proveito da arquitetura dual-core, você precisa considerar quebrar seu aplicativo em múltiplos processos.

Se você quer melhorar a capacidade de resposta, você deve considerar o uso de threads. Existem outras alternativas, porém, a saber microthreading . Há também algumas estruturas que você deve olhar para:

Respondeu 28/08/2008 em 01:00
fonte usuário

votos
19

Abaixo está uma amostra básica threading. Ele vai gerar 20 tópicos; cada vontade saída de rosca seu número de rosca. Executá-lo e observar a ordem em que eles imprimem.

import threading
class Foo (threading.Thread):
    def __init__(self,x):
        self.__x = x
        threading.Thread.__init__(self)
    def run (self):
          print str(self.__x)

for x in xrange(20):
    Foo(x).start()

Como você ter insinuado tópicos Python são implementadas através de time-slicing. Isto é como eles obter o efeito "paralelo".

No meu exemplo minha classe Foo estende discussão, eu, em seguida, implementar o runmétodo, que é onde o código que você gostaria de executar em um segmento vai. Para iniciar o fio que você chama start()no objeto segmento, que irá invocar automaticamente o runmétodo ...

Claro, este é apenas o básico do básico. Você acabará por querer aprender sobre semáforos, exclusões mútuas, e bloqueios para sincronização de threads e passagem de mensagens.

Respondeu 28/08/2008 em 00:52
fonte usuário

votos
10

Use tópicos em python se os trabalhadores individuais estão fazendo operações de I / O bound. Se você está tentando escalar em vários núcleos em uma máquina, quer encontrar um bom IPC estrutura para python ou escolher um idioma diferente.

Respondeu 28/08/2008 em 03:34
fonte usuário

votos
3

Nota: onde quer que eu mencionar threadque eu quero dizer especificamente segmentos em python até explicitamente declarado.

Threads trabalhar um pouco diferente em python, se você está vindo do C/C++fundo. Em python, apenas um thread pode estar em estado de execução num determinado time.This significa Tópicos no python não pode realmente alavancar o poder de múltiplos núcleos de processamento, uma vez por design não é possível para threads para executar em paralelo em múltiplos núcleos.

Como o gerenciamento de memória em python não é thread-safe cada thread requerem um acesso exclusivo a estruturas de dados em interpreter.This python acesso exclusivo é adquirido por um mecanismo chamado (bloqueio interpretr global) .GIL

Why does python use GIL?

A fim de evitar vários segmentos de aceder estado intérprete simultaneamente e corromper o estado intérprete.

A idéia é sempre que um thread está sendo executado (mesmo que seja o segmento principal) , a GIL é adquirido e depois de algum intervalo de tempo predefinido a GIL é liberado pelo segmento atual e readquirido por algum outro thread (se houver).

Why not simply remove GIL?

Não é que a sua impossibilidade de remover GIL, é só que em prcoess de fazê-lo, acabam colocando mutiple fechaduras dentro intérprete, a fim de serializar o acesso, o que torna até mesmo um único aplicativo de rosca menos eficaz.

portanto, o custo da remoção GIL é pago pelo desempenho reduzido de uma única aplicação de rosca, que não é desejado.

So when does thread switching occurs in python?

parâmetro thread ocorre quando GIL é released.So quando é GIL Lançado? Há dois cenários a ter em consideração.

Se um thread está fazendo operações da CPU Bound (processamento de imagem Ex).

Em versões mais antigas do python, troca de threads usado para ocorrer após um não de python fixo instructions.It foi por padrão definido para 100.Ele descobriu-se que não é uma boa política para decidir quando mudar deve ocorrer desde o tempo gasto executando uma única instrução pode muito muito de milissegundo para até mesmo um second.Therefore liberando GIL após cada 100instruções independentemente do tempo que levam para executar uma política pobre.

Em novas versões em vez de usar contagem de instruções como uma métrica para alternar fio, um intervalo de tempo configurável é usado. O intervalo de mudança de padrão é de 5 milliseconds.you pode obter o intervalo de mudança atual usando sys.getswitchinterval(). Isto pode ser alterado usandosys.setswitchinterval()

Se um thread está fazendo algumas operações IO Bound (Ex acesso de arquivos ou
rede IO)

GIL é a liberação sempre que o segmento está esperando por algum para a operação IO para ficar concluída.

Which thread to switch to next?

O intérprete não tem seu próprio segmento scheduler.which fica marcada no final do intervalo é a decisão do sistema operacional. .

Respondeu 30/03/2018 em 11:47
fonte usuário

votos
3

Uma solução fácil para o GIL é o multiprocessamento módulo. Ele pode ser usado como uma gota de substituição para o módulo de threading, mas usa múltiplos processos intérprete em vez de threads. Devido a isso, há um pouco mais sobrecarga do que enfiar simples para coisas simples, mas que lhe dá a vantagem de paralelização real, se você precisar dele. Também escala facilmente a várias máquinas físicas.

Se você precisar de paralelização verdadeiramente grande escala do que gostaria de olhar mais longe, mas se você quiser apenas para dimensionar a todos os núcleos de um computador ou alguns diferentes sem todo o trabalho que iria para a implementação de um quadro mais abrangente, do que este é para você .

Respondeu 06/02/2014 em 17:19
fonte usuário

votos
2

Tente lembrar-se que o GIL está definido para pesquisar em torno de vez em quando, a fim de fazer mostrar o aparecimento de múltiplas tarefas. Esta configuração pode ser ajustado, mas eu oferecer a sugestão de que deve haver um trabalho que os fios estão fazendo ou muitas trocas de contexto vão causar problemas.

Eu iria tão longe como a sugerir vários pais em processadores e tentar manter como trabalhos sobre o mesmo núcleo (s).

Respondeu 28/07/2009 em 23:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more