![Sem servidor não significa DevOpsLess ou NoOps](https://optimuscloud.com.br/wp-content/uploads/2024/01/1706227797_Sem-servidor-nao-significa-DevOpsLess-ou-NoOps-150x150.jpg)
Sem servidor não significa DevOpsLess ou NoOps
25 de janeiro de 2024![Nublado com possibilidade de malware – O que está acontecendo para DevOps?](https://optimuscloud.com.br/wp-content/uploads/2024/01/1706231175_Nublado-com-possibilidade-de-malware-–-O-que-esta-acontecendo-150x150.jpg)
Nublado com possibilidade de malware – O que está acontecendo para DevOps?
25 de janeiro de 2024Python 3.12 foi lançado com novos recursos e melhorias de desempenho, alguns contribuídos pela Meta, que está mostrando seu suporte contínuo ao código aberto.
“O código aberto no Meta é uma parte importante de como trabalhamos e compartilhamos nossos aprendizados com a comunidade”, escreveu Carl Meyer, engenheiro de software da unidade Meta no Instagram, em uma postagem no blog sobre as contribuições do Meta para o Python 3.12.
Python é uma das principais linguagens de programação da Meta e é usada para seu trabalho de IA/ML, com destaque para o desenvolvimento do PyTorch pela empresa, uma estrutura de aprendizado de máquina usada para vários casos de uso, como visão computacional, processamento de linguagem natural e muito mais. Python também é uma parte essencial da infraestrutura da Meta, assim como da pilha de servidores do Instagram.
A Meta tem trabalhado em estreita colaboração com a comunidade para introduzir novos recursos e otimizações para melhorar o desempenho do Python e permitir experimentações mais fáceis de terceiros com otimizações de tempo de execução do Python.
Objetos Imortais
Um dos novos recursos que Meta adicionou ao Python 3.12 é algo chamado Immortal Objects.
Meyer observou que Immortal Objects – Python Enhancement Proposal (PEP) 683 torna possível criar objetos Python que não participam da contagem de referências e permanecerão ativos até o desligamento do interpretador Python. A motivação original para esse recurso era reduzir o uso de memória na bifurcação da carga de trabalho do servidor web do Instagram, reduzindo as cópias nas gravações acionadas por atualizações de contagem de referência, disse ele.
Além disso, os objetos imortais também são um passo importante em direção a objetos Python verdadeiramente imutáveis que podem ser compartilhados entre intérpretes Python sem necessidade de bloqueio, por exemplo, por meio do bloqueio de interpretador global (GIL). Isso pode permitir um paralelismo aprimorado de processo único do Python, seja via vários subinterpretadores ou multithreading sem GIL, acrescentou Meyer.
O Instagram introduziu objetos imortais – PEP-683 – no Python.
“Agora, os objetos podem ignorar as verificações de contagem de referência e viver durante toda a execução do tempo de execução, abrindo caminhos interessantes para o verdadeiro paralelismo”, escreveu Eddie Elizondo, outro engenheiro de software do Instagram em uma postagem separada no blog sobre Immortal Objects. “Na Meta, usamos Python (Django) para nosso servidor frontend no Instagram. Para lidar com o paralelismo, contamos com uma arquitetura multiprocessos juntamente com asyncio para simultaneidade por processo. No entanto, nossa escala — tanto em termos de lógica de negócios quanto de volume de solicitações tratadas — pode causar um aumento na pressão de memória, levando a gargalos de eficiência.”
O problema da mutação de estado de objetos compartilhados está no cerne de como o tempo de execução do Python funciona, disse Elizondo. Dado que depende de contagem de referências e detecção de ciclo, o tempo de execução requer a modificação da estrutura de memória central do objeto, que é uma das razões pelas quais a linguagem requer um bloqueio de interpretador global (GIL).
“Para contornar esse problema, introduzimos os Objetos Imortais – PEP-683”, escreveu ele. Isso cria um objeto imortal (um objeto para o qual o estado do objeto principal nunca mudará) marcando um valor especial no campo de contagem de referência do objeto. Ele permite que o tempo de execução saiba quando pode ou não alterar os campos de contagem de referência e o cabeçalho do GC.”
Outros novos recursos
Outros novos recursos que Meta contribuiu para Python 3.12 incluem:
- Digite melhorias no sistema
- Otimizações de desempenho
- Novos benchmarks
- Ganchos de cinza
Em relação às melhorias no sistema de tipos, a equipe de engenharia por trás do Pyre, um verificador de tipos Python de código aberto, criou e implementou o PEP 698 para adicionar um decorador @typing.override, que ajuda a evitar bugs ao refatorar hierarquias de herança de classe que usam substituição de método.
“Os desenvolvedores Python podem aplicar esse novo decorador a um método de subclasse que substitui um método de uma classe base”, disse Meyer. “Como resultado, os verificadores de tipo estático serão capazes de avisar os desenvolvedores se a classe base for modificada de forma que o método substituído não exista mais.”
Otimizações de desempenho
Meyer explicou que nas versões anteriores do Python, todas as compreensões eram compiladas como funções aninhadas e cada execução de uma compreensão alocava e destruía um objeto de função Python de uso único.
No entanto, “conseguimos o PEP 709 para Python 3.12, que incorpora todas as listas, ditados e definições de compreensão para melhor desempenho – até duas vezes melhor na melhor das hipóteses”, disse ele. “A implementação e depuração do PEP 709 também descobriu um bug pré-existente no compilador de bytecode que poderia resultar na execução silenciosamente errada de código no Python 3.11, que corrigimos.”
Enquanto isso, por vários anos, Meta compartilhou seu trabalho em Python e CPython por meio de seu tempo de execução Python de código aberto, Cinder. A empresa também tem trabalhado em estreita colaboração com a comunidade Python para introduzir novos recursos e otimizações para melhorar o desempenho do Python e permitir que terceiros experimentem a otimização do tempo de execução do Python com mais facilidade, disse Meyer.
Além disso, ele disse que algumas partes do Cinder (nosso compilador JIT e Static Python) não fariam sentido como parte do CPython upstream (devido ao suporte limitado da plataforma, C versus C++, mudanças semânticas e apenas o tamanho do código), então nosso objetivo é empacotá-los como um módulo de extensão independente, CinderX.
Isso requer uma série de novos ganchos no tempo de execução principal, observou Meyer, acrescentando que o Meta conseguiu muitos desses ganchos no Python 3.12:
- Uma API para definir o ponto de entrada vectorcall para uma função Python. Isso dá ao JIT um ponto de entrada para assumir a execução de uma determinada função.
- Adicionamos observadores de dicionário, observadores de tipo, observadores de função e observadores de objeto de código. Tudo isso permite que o Cinder JIT seja notificado sobre mudanças dinâmicas que possam invalidar suas suposições, para que seu caminho rápido possa permanecer o mais rápido possível.
- Conseguimos extensibilidade no gerador de código para o interpretador principal do CPython que permitirá que o Static Python regenere facilmente um interpretador com opcodes Static Python adicionados e uma API C para visitar todos os objetos rastreados por GC, o que permitirá que o Cinder JIT descubra funções que foram criados antes de ser ativado.
- Também adicionamos uma API thread-safe para gravação em arquivos perf-map. Os arquivos Perf-map permitem que o perf profiler do Linux forneça um nome legível para seções de código de máquina geradas dinamicamente, por exemplo, de um compilador JIT. Esta API permitirá que o Cinder JIT grave com segurança em arquivos de mapa perf sem colidir com outros JITs ou com o novo recurso trampolim perf do Python 3.12.
Referências
O conjunto Python Performance Benchmark é o conjunto padrão de benchmarks usado no trabalho de otimização de código aberto do Python. Durante o ciclo de desenvolvimento 3.12, contribuímos com vários novos benchmarks para que represente com mais precisão as características da carga de trabalho que vemos no Meta.
A empresa acrescentou:
- Um conjunto de benchmarks async_tree que modelam melhor uma carga de trabalho assíncrona pesada.
- Um par de benchmarks que exercitam a compreensão e super() de forma mais completa, que eram pontos cegos do conjunto de benchmarks existente.
“O trabalho da Meta com a comunidade Python não termina com o lançamento 3.12”, disse Meyer. “Estamos atualmente discutindo uma nova proposta, PEP 703, com o Python Steering Council para remover o GIL e permitir que o Python seja executado em múltiplos threads em paralelo. Esta atualização pode ajudar muito qualquer pessoa que use Python em um ambiente multithread.”
Finalmente, o envolvimento da Meta com a comunidade Python também vai além do código. Em 2023, continuamos a apoiar o programa Developer in Residence para Python e eventos patrocinados como PyCon US, disse Meyer.
A postagem Meta adiciona novos recursos interessantes ao Python 3.12 apareceu pela primeira vez em The New Stack.