Pergunta

Eu estou esperando que alguém pode fornecer alguns insights sobre o que é fundamentalmente diferente sobre a Máquina Virtual Java que lhe permite implementar tópicos bem sem a necessidade de um Global Interpreter Lock (GIL), enquanto Python necessita de tal mal.

Foi útil?

Solução

Python (a língua) não precisa de um GIL (que é por isso que pode perfeitamente ser implementado em JVM [Jython] e .NET [IronPython], e essas implementações multithread livremente). CPython (a implementação popular) sempre usou um GIL para facilidade de codificação e de integração das bibliotecas de código C-non-thread-safe (costumava haver uma tonelada de pessoas à sua volta (esp a codificação dos mecanismos de recolha de lixo.); -).

O andorinha Unladen projeto, entre outras metas ambiciosas, faz plano uma máquina virtual GIL-livre para Python - para citar o site, "Além , temos a intenção de remover o GIL e corrigir o estado de multithreading em Python. acreditamos que isso é possível através da implementação de um sistema de GC mais sofisticado, algo como da IBM Recycler (Bacon et al, 2001). "

Outras dicas

A JVM (pelo menos hotspot) tem um conceito semelhante ao "GIL", é apenas muito mais fina em sua granularidade do bloqueio, a maior parte disso vem do GC no hotspot que estão mais avançados.

Em CPython é um grande bloqueio (provavelmente não é verdade, mas bom o suficiente por causa de argumentos), na JVM é mais se espalhou sobre com conceitos diferentes, dependendo de onde ele é usado.

Dê uma olhada, por exemplo, vm / runtime / safepoint.hpp no ??código hotspot, que é efetivamente uma barreira. Uma vez em um ponto seguro de toda a VM parou no que diz respeito ao código java, muito parecido com o python VM pára na GIL.

No mundo Java tais eventos parando VM são conhecidas como "stop-the-world", nesses pontos apenas o código nativo que é obrigado a determinados critérios é o corredor livre, o resto da VM foi interrompido.

Além disso, a falta de um bloqueio grosseiro em java faz JNI muito mais difícil de escrever, como a JVM faz menos garantias sobre seu ambiente para chamadas FFI, uma das coisas que CPython torna bastante fácil (embora não seja tão fácil quanto usar ctypes ).

Há um comentário abaixo neste blog http://www.grouplens.org/node/ 244 que sugere a razão por que era tão fácil de dispensa com um GIL para IronPython ou Jython, é que CPython usa a contagem de referência ao passo que os outros 2 VMs tem colectores de lixo.

Os mecanismos exatos de por que isso é assim que eu não entendo, mas ele soa como uma razão plausível.

Nesta ligação eles têm a seguinte explicação:

... "Peças do intérprete não são threadsafe, embora principalmente porque tornando-os todos threadsafe pelo uso de bloqueio maciço iria atrasar single-threaded extremamente ( fonte ). Isto parece estar relacionado com o coletor de lixo CPython utilizando contagem de referência (o JVM e CLR não, e, portanto, não precisa de bloqueio / liberar uma referência contar cada vez). Mas mesmo se alguém pensou em uma solução aceitável e implementou, bibliotecas de terceiros ainda teria os mesmos problemas. "

Python carece jit / AOT e o período de tempo que foi escrito em processadores multi-threaded não existia. Alternativamente, você pode recompilar tudo em Julia lang que carece GIL e ganhar algum aumento de velocidade em seu código Python. Também Jython tipo de porcaria que é mais lento do que CPython e Java. Se você quiser ficar com Python considerar o uso de plugins paralelas, você não vai ganhar um impulso de velocidade instantânea, mas você pode fazer programação paralela com o plugin certo.

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