Python e Golang - Parte 1
Índice:
1. Introdução a CPUs multi-core
2. CPU Bound versus IO Bound
3. Introdução a Golang
4. Matriz comparativa entre Python e Golang
5. Instalação do Golang
6. Criação de um diretório para o projeto Golang
7. Criação do primeiro programa Golang
8. Ajustando as variáveis de memória do SO para o Golang
9. Compilação do primeiro programa Golang
10. Execução do primeiro programa Golang
11. Criação de programa Python Hello
12. Conclusão da parte 1
1. Introdução a CPUs multi-core
“Todos nós temos máquinas multi-core. A maior parte desse poder é
desperdiçado, enquanto muitos desses núcleos estão inativos. Então, por
que todos nós temos máquinas com tantos núcleos não utilizados? Porque
a Intel e a AMD estão competindo. Dessa forma, A Intel e a AMD nos
ofertam o que parece ser máquinas mais rápidas. Eles não podem nos dar
mais ciclos (por segundo), já que, se o fizessem, nossas máquinas se
derreteriam. Então, eles nos dão núcleos adicionais. O número de
transistores aumenta, e a lei de Moore (tecnicamente) mantêm-se
verdadeira, mas para a maioria de nós, esse poder é amplamente
inutilizado”.
Fonte: http://www.davekuhlman.org/python_multiprocessing_01.html
2. CPU Bound versus IO Bound
Resumidamente:
CPU Bound - gargalo dos processos computacionais na CPU,
IO Bound - gargalo dos processos computacionais nos dispositivos de E/S
(entrada e saída) computacionais.
3. Introdução a Golang
Lí, alguns anos atrás, não lembro onde, que o Go é uma linguagem de
programação de sistemas concorrentes. Um de seus objetivos é enfrentar o
desafio da programação paralela de múltiplos núcleos.
Concorrência em programação de computadores é a composição de
execução independente de processos. Imagine um computador com apenas
uma CPU/Core, quando o teclado, o mouse e o monitor estão funcionando;
existe aí uma concorrência. Outro exemplo é o equilíbrio de pratos. Fonte:
https://www.youtube.com/watch?v=cN_DpYBzKso
Encontrei no site oficial do Golang o extrato abaixo:
"Concorrência (trata de lidar com várias coisas ao mesmo tempo) não é
paralelismo (fazer várias coisas ao tempo tempo, ex.: dirigir um carro e
falar ao telefone ao mesmo tempo é paralelismo), com a concorrência do
Golang é o que torna um programa muito rápido e sólido. Golang tem a
capacidade de implementar códigos concorrentemente, em essência, a
concorrência é a composição de execução independente de processos.
Pode lidar facilmente com muitas coisas ao mesmo tempo, isto é muito útil
na programação moderna. Economiza custos e recursos".
Leia a fonte original em inglês no site oficial:
https://golangtutorial.com/why-learn-golang-what-is-golang-used-for/
Pretendo: comparar, lapidar, expandir e extrapolar a informação referente
aos temas Python e Golang. Esclarecer o assunto, executar programas em
múltiplos núcleos físicos e virtuais com Python e Golang.
4. Matriz comparativa entre Python e Golang
Python Golang
Foco Permite que você trabalhe
rapidamente e integre sistemas
rapidamente. Fonte:
www.python.org
Procedural, funcional e
orientada a objetos. Forte
Linguagem procedural
concorrêncial, projetada para
software em nuvem escalável.
Fonte:
https://www.youtube.com/watc
h?v=cQ7STILAS0M
utilização de lista, tuplas e
dicionários.
Estatísticas do CPython no
GitHub atualmente:
Stars: 25.820
Forks: 10.978
Data lançamento: 1991
Criado com concorrência em
mente. Fonte:
https://www.youtube.com/watc
h?v=keYDVuE7ONE
Estatísticas do Golang no
GitHub atualmente:
Stars: 61.625
Forks: 8.570
Data lançamento: 2009
Tipo Interpretado, pode compilar
para que a próxima vez que
executar não precise compilar
novamente. Há também a opção
de compilação forçada com
cython e gcc.
Interpretado e compilado
Concurrency
(Concorrência)
Maneiras:
threads, Twisted, Tornado,
aiohttp (aiohttp is http
framweork client/server for
Python and AsyncIO. It
supports both server
websockets and client
websockets. As it works
asynchronously, it can handle
hundreds of requests per
seconds providing better
performance than other
frameworks) Fonte:
https://medium.com/@apcelent/
how-to-create-rest-api-using-
aiohttp-3a5ada4b08d4
Celery (“se você precisa
resolver problemas na semana
que vem ou mês que vem e não
dá tempo de aprender Go então
resolva com Celery” Fonte:
https://www.youtube.com/watc
h?v=_tzI20TCVuc
asyncio é uma biblioteca,
nativa do Python, para escrever
código concorrente. Geralmente
um ajuste perfeito para código
em cloud/network de alto nível
e IO bound.
Fonte:
https://docs.python.org/3/library
/asyncio.html
É a capacidade de escrever seu
programa como peças
independentes. Possui 3
elementos:
goroutines (execução),
channels (comunicação),
select(coordenação)
Fonte:
https://www.youtube.com/watc
h?v=cQ7STILAS0M
O package asyncio recebeu
enormes melhorias na versão
3.7, tornando-o muito simples.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Code style according to
pycodestyle
import time
import asyncio
async def count():
print("Step 1")
await asyncio.sleep(1) # O
sleep simula um
processamentos para
print("Step 2") #
verificar o retorno da função
assíncrona
async def main():
await asyncio.gather(count(),
count(), count())
if __name__ == "__main__":
s = time.perf_counter()
asyncio.run(main())
elapsed = time.perf_counter()
- s
print(f"{__file__} executed
in {elapsed:0.2f} seconds.")
Parallelism (Paralelismo) Threads/process
Bibliotecas Numpy, Pandas, Scikit Learn,
Tensor Flow, Matplot Lib,
SciPy, Scrapy(crawling)
Python Golang
Aplicações DataAnalytics, IoT, Web Dev,
Desktop Dev, Artificial
Intelligence, System
Programming, Embarcados
System programming, Cloud
Computing, Web Dev,
Programa Hello print('Go ahead with Python!') package main
import "fmt"
func main() {
fmt.Printf("Go ahead with
Golang!")
}
Tamanho em Bytes do
arquivo texto “Hello”
33 86
Tamanho em Bytes do
arquivos “Hello”
compilado
20576 1463340
Permite chamar
funções em C?
Sim Sim
Python Golang
Possui Garbage
Collector?
Sim Sim
Formatação de código
fonte para efetivamente
funcionar ou apenas
obter melhor
legibilidade
autopep8 --in-place
--aggressive --aggressive
<nome arquivo>
OU
pycodestyle <nome arquivo>
gofmt -w <nome arquivo>
assim como Python, Go tem
uma posição rígida quanto à
formatação do próprio código.
Ex. Na expressão x + y uma
quebra de linha é permitida
após o operado +, mas não
antes.
Fonte: Donovan, 2017
Programa para
manipular packages
pip go get
got get -u all (atualiza todos os
packages apontados em
GOPATH)
Principais frameworks
atualmente
Django, Flask, Celery,
Tornado, aiohttp, MicroPython
for IoT
Beego (inspirado em Python
Tornado e PHP Sinatra;
segundo o site oficial do Beego.
Os sites não oficiais dizem
Python Django), Gin
5. Instalação do Golang
A instalação pode ser feita por meio de duas formas diferente (escolha
entre a 1a ou 1b, abaixo):
1a) por meio do repositório Linux. Se deseja esta, pule para a tarjeta cinza
abaixo:
OU
1b) por meio do comando wget,
Baixe o arquivo Golang do site oficial respeitando a arquitetura do
processador, ao tipo do sistema operacional e a versão do produto
propriamente dita.
$ wget https://dl.google.com/go/<versão indicada>.gz
Arquivos baixados devem ser conferidos com o comando:
$ sha256sum <versão indicada>.gz
Extraia o conteúdo do arquivo gz conforme o comando:
$ sudo tar -C /usr/local -xvzf <versão indicada>.gz
Faço aqui a instalar por meio do repositório Linux (opção 1a):
Neste método a instalação se restringe a versão corrente do pacote
disponível no repositório e por consequência pode estar desatualizado em
relação ao site oficial do produto em questão. Porém, é uma garantia que
irá baixar a versão correta alinhada perfeitamente ao sistema operacional.
$ sudo apt-get install golang
Verifique a versão instalada do golang
$ go version
Conheça as variáveis de memória e seus valores do golang:
$ go env
6. Criação de um diretório para o projeto Golang
$ cd Desktop
Crie um diretorio especialmente para projetos do golang:
$ mkdir golang_proj
$ cd golang_proj
7. Criação do primeiro programa Golang
$ vim hellogo.go
package main
import "fmt"
func main() {
fmt.Printf("Go ahead with Golang!")
}
8. Ajustando as variáveis de memória no SO para o Golang
São três: PATH, GOPATH e GOBIN
a) Execute: "go env" e veja o valor da variável GOROOT
b) inclua esse valor no path, conforme explicado abaixo:
$ export PATH=$PATH:<path exibido na variavel GOROOT>
GOPATH é a pasta criada para o meu projeto GO
$ export GOPATH=/home/<USER>/Desktop/golang_proj
$ export GOBIN=$GOPATH/bin
$ export PATH=$PATH:$GOBIN
Execute: "go env" e confirme que está tudo correto.
9. Compilação do primeiro programa Golang
$ go install hellogo.go
10. Execução do primeiro programa Golang
$GOBIN/hellogo
Go ahead with Golang!
OU
cd bin
$ ./hellogo
Go ahead with Golang!
11. Criação de programa Python Hello
$ vim hellopy.py
print("Go ahead with Golang!")
$ python3 hellopy.py
Go ahead with Python!
O arquivo hellopy.py é executado por meio do interpretador CPython.
Porém, o arquivo também pode ser compilado com o gcc (Gnu C
Compiler) e se tornar compilado assim como o arquivo do Golang.
Os erros de sintaxe são verificados por meio do compilador Cython (um
passo antes do compilador gcc)
Vejamos:
$ cython --embed hellopy.py -3
$ ls -la
-rw-r--r-- 1 pi pi 105631 jul 26 14:52 hellopy.c
-rw-r--r-- 1 pi pi 33 jul 26 14:43 hellopy.py
$ gcc -Os -I /usr/include/python3.5m -o hellopy hellopy.c -lpython3.5m
-lpthread -lm -lutil -ldl
$ ls -la
-rwxr-xr-x 1 pi pi 20576 jul 26 14:58 hellopy
-rw-r--r-- 1 pi pi 105631 jul 26 14:52 hellopy.c
-rw-r--r-- 1 pi pi 33 jul 26 14:43 hellopy.py
$ ./hellopy
Go ahead with Python!
Desenvolvendo este estudo, eu encontrei a fonte onde havia lido que o
Golang é uma linguagem de programação de sistemas concorrentes, foi
aqui: https://www.ualr.edu/pxtang/papers/ACC10.pdf
12. Conclusão da parte 1
A comparação entre Python e Golang foi válida porque demonstrou o quão
diferentes esses produtos são no presente estágio de maturidade. O Golang
é uma linguagem de programação leve focada em concorrência. Python,
por sua vez, é uma linguagem de programação robusta, focada em
produtividade, legibilidade de código e com enorme capacidade em
importar bibliotecas consagradas de terceiros, além de uma grande
quantidade de frameworks disponíveis.
O profissional diferenciado conhece as duas linguagens e aplica cada uma
delas objetivando solucionar problemas distintos.
Tenho bem mais experiência com Python do que com o Golang, o
conhecimento adquirido até aqui com o Golang foi surpreendente e deixa
uma boa impressão, além deste estudo ser um ótimo ponto de partida para
todos nós.
Bibliografia:
Donovan, Alan A. A.; Kernighan, Brian W.; Tradução: Lúcia A. Kinoshita,
A Linguagem de Programação Go, Editora Novatec, 2017
Gostou? Dê um like! Fique a vontade em compartilhar e usar no seu estudo de
caso. Apenas informe a fonte. Obrigado e sucesso!
Ahhh eu tenho uma lista de desejo na Amazon:
I have a wishlist at Amazon
https://www.amazon.com.br/hz/wishlist/ls/2Y2J3ADYO50TH
Could you do me a kindness? :-)
Marcos Aurelio Barranco
SP/SP
6/Julho/2019
Atualizado em: 29/Agosto/2019

Python e Golang - Parte 1

  • 1.
    Python e Golang- Parte 1 Índice: 1. Introdução a CPUs multi-core 2. CPU Bound versus IO Bound 3. Introdução a Golang 4. Matriz comparativa entre Python e Golang 5. Instalação do Golang 6. Criação de um diretório para o projeto Golang 7. Criação do primeiro programa Golang 8. Ajustando as variáveis de memória do SO para o Golang 9. Compilação do primeiro programa Golang 10. Execução do primeiro programa Golang 11. Criação de programa Python Hello 12. Conclusão da parte 1 1. Introdução a CPUs multi-core “Todos nós temos máquinas multi-core. A maior parte desse poder é desperdiçado, enquanto muitos desses núcleos estão inativos. Então, por que todos nós temos máquinas com tantos núcleos não utilizados? Porque a Intel e a AMD estão competindo. Dessa forma, A Intel e a AMD nos ofertam o que parece ser máquinas mais rápidas. Eles não podem nos dar mais ciclos (por segundo), já que, se o fizessem, nossas máquinas se derreteriam. Então, eles nos dão núcleos adicionais. O número de transistores aumenta, e a lei de Moore (tecnicamente) mantêm-se verdadeira, mas para a maioria de nós, esse poder é amplamente inutilizado”. Fonte: http://www.davekuhlman.org/python_multiprocessing_01.html 2. CPU Bound versus IO Bound Resumidamente: CPU Bound - gargalo dos processos computacionais na CPU, IO Bound - gargalo dos processos computacionais nos dispositivos de E/S (entrada e saída) computacionais.
  • 2.
    3. Introdução aGolang Lí, alguns anos atrás, não lembro onde, que o Go é uma linguagem de programação de sistemas concorrentes. Um de seus objetivos é enfrentar o desafio da programação paralela de múltiplos núcleos. Concorrência em programação de computadores é a composição de execução independente de processos. Imagine um computador com apenas uma CPU/Core, quando o teclado, o mouse e o monitor estão funcionando; existe aí uma concorrência. Outro exemplo é o equilíbrio de pratos. Fonte: https://www.youtube.com/watch?v=cN_DpYBzKso Encontrei no site oficial do Golang o extrato abaixo: "Concorrência (trata de lidar com várias coisas ao mesmo tempo) não é paralelismo (fazer várias coisas ao tempo tempo, ex.: dirigir um carro e falar ao telefone ao mesmo tempo é paralelismo), com a concorrência do Golang é o que torna um programa muito rápido e sólido. Golang tem a capacidade de implementar códigos concorrentemente, em essência, a concorrência é a composição de execução independente de processos. Pode lidar facilmente com muitas coisas ao mesmo tempo, isto é muito útil na programação moderna. Economiza custos e recursos". Leia a fonte original em inglês no site oficial: https://golangtutorial.com/why-learn-golang-what-is-golang-used-for/ Pretendo: comparar, lapidar, expandir e extrapolar a informação referente aos temas Python e Golang. Esclarecer o assunto, executar programas em múltiplos núcleos físicos e virtuais com Python e Golang. 4. Matriz comparativa entre Python e Golang Python Golang Foco Permite que você trabalhe rapidamente e integre sistemas rapidamente. Fonte: www.python.org Procedural, funcional e orientada a objetos. Forte Linguagem procedural concorrêncial, projetada para software em nuvem escalável. Fonte: https://www.youtube.com/watc h?v=cQ7STILAS0M
  • 3.
    utilização de lista,tuplas e dicionários. Estatísticas do CPython no GitHub atualmente: Stars: 25.820 Forks: 10.978 Data lançamento: 1991 Criado com concorrência em mente. Fonte: https://www.youtube.com/watc h?v=keYDVuE7ONE Estatísticas do Golang no GitHub atualmente: Stars: 61.625 Forks: 8.570 Data lançamento: 2009 Tipo Interpretado, pode compilar para que a próxima vez que executar não precise compilar novamente. Há também a opção de compilação forçada com cython e gcc. Interpretado e compilado Concurrency (Concorrência) Maneiras: threads, Twisted, Tornado, aiohttp (aiohttp is http framweork client/server for Python and AsyncIO. It supports both server websockets and client websockets. As it works asynchronously, it can handle hundreds of requests per seconds providing better performance than other frameworks) Fonte: https://medium.com/@apcelent/ how-to-create-rest-api-using- aiohttp-3a5ada4b08d4 Celery (“se você precisa resolver problemas na semana que vem ou mês que vem e não dá tempo de aprender Go então resolva com Celery” Fonte: https://www.youtube.com/watc h?v=_tzI20TCVuc asyncio é uma biblioteca, nativa do Python, para escrever código concorrente. Geralmente um ajuste perfeito para código em cloud/network de alto nível e IO bound. Fonte: https://docs.python.org/3/library /asyncio.html É a capacidade de escrever seu programa como peças independentes. Possui 3 elementos: goroutines (execução), channels (comunicação), select(coordenação) Fonte: https://www.youtube.com/watc h?v=cQ7STILAS0M
  • 4.
    O package asynciorecebeu enormes melhorias na versão 3.7, tornando-o muito simples. #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Code style according to pycodestyle import time import asyncio async def count(): print("Step 1") await asyncio.sleep(1) # O sleep simula um processamentos para print("Step 2") # verificar o retorno da função assíncrona async def main(): await asyncio.gather(count(), count(), count()) if __name__ == "__main__": s = time.perf_counter() asyncio.run(main()) elapsed = time.perf_counter() - s print(f"{__file__} executed in {elapsed:0.2f} seconds.") Parallelism (Paralelismo) Threads/process Bibliotecas Numpy, Pandas, Scikit Learn, Tensor Flow, Matplot Lib, SciPy, Scrapy(crawling) Python Golang Aplicações DataAnalytics, IoT, Web Dev, Desktop Dev, Artificial Intelligence, System Programming, Embarcados System programming, Cloud Computing, Web Dev, Programa Hello print('Go ahead with Python!') package main import "fmt" func main() { fmt.Printf("Go ahead with
  • 5.
    Golang!") } Tamanho em Bytesdo arquivo texto “Hello” 33 86 Tamanho em Bytes do arquivos “Hello” compilado 20576 1463340 Permite chamar funções em C? Sim Sim Python Golang Possui Garbage Collector? Sim Sim Formatação de código fonte para efetivamente funcionar ou apenas obter melhor legibilidade autopep8 --in-place --aggressive --aggressive <nome arquivo> OU pycodestyle <nome arquivo> gofmt -w <nome arquivo> assim como Python, Go tem uma posição rígida quanto à formatação do próprio código. Ex. Na expressão x + y uma quebra de linha é permitida após o operado +, mas não antes. Fonte: Donovan, 2017 Programa para manipular packages pip go get got get -u all (atualiza todos os packages apontados em GOPATH) Principais frameworks atualmente Django, Flask, Celery, Tornado, aiohttp, MicroPython for IoT Beego (inspirado em Python Tornado e PHP Sinatra; segundo o site oficial do Beego. Os sites não oficiais dizem Python Django), Gin 5. Instalação do Golang A instalação pode ser feita por meio de duas formas diferente (escolha entre a 1a ou 1b, abaixo): 1a) por meio do repositório Linux. Se deseja esta, pule para a tarjeta cinza abaixo: OU
  • 6.
    1b) por meiodo comando wget, Baixe o arquivo Golang do site oficial respeitando a arquitetura do processador, ao tipo do sistema operacional e a versão do produto propriamente dita. $ wget https://dl.google.com/go/<versão indicada>.gz Arquivos baixados devem ser conferidos com o comando: $ sha256sum <versão indicada>.gz Extraia o conteúdo do arquivo gz conforme o comando: $ sudo tar -C /usr/local -xvzf <versão indicada>.gz Faço aqui a instalar por meio do repositório Linux (opção 1a): Neste método a instalação se restringe a versão corrente do pacote disponível no repositório e por consequência pode estar desatualizado em relação ao site oficial do produto em questão. Porém, é uma garantia que irá baixar a versão correta alinhada perfeitamente ao sistema operacional. $ sudo apt-get install golang Verifique a versão instalada do golang $ go version Conheça as variáveis de memória e seus valores do golang: $ go env 6. Criação de um diretório para o projeto Golang $ cd Desktop Crie um diretorio especialmente para projetos do golang: $ mkdir golang_proj $ cd golang_proj 7. Criação do primeiro programa Golang $ vim hellogo.go
  • 7.
    package main import "fmt" funcmain() { fmt.Printf("Go ahead with Golang!") } 8. Ajustando as variáveis de memória no SO para o Golang São três: PATH, GOPATH e GOBIN a) Execute: "go env" e veja o valor da variável GOROOT b) inclua esse valor no path, conforme explicado abaixo: $ export PATH=$PATH:<path exibido na variavel GOROOT> GOPATH é a pasta criada para o meu projeto GO $ export GOPATH=/home/<USER>/Desktop/golang_proj $ export GOBIN=$GOPATH/bin $ export PATH=$PATH:$GOBIN Execute: "go env" e confirme que está tudo correto. 9. Compilação do primeiro programa Golang $ go install hellogo.go 10. Execução do primeiro programa Golang $GOBIN/hellogo Go ahead with Golang! OU cd bin
  • 8.
    $ ./hellogo Go aheadwith Golang! 11. Criação de programa Python Hello $ vim hellopy.py print("Go ahead with Golang!") $ python3 hellopy.py Go ahead with Python! O arquivo hellopy.py é executado por meio do interpretador CPython. Porém, o arquivo também pode ser compilado com o gcc (Gnu C Compiler) e se tornar compilado assim como o arquivo do Golang. Os erros de sintaxe são verificados por meio do compilador Cython (um passo antes do compilador gcc) Vejamos: $ cython --embed hellopy.py -3 $ ls -la -rw-r--r-- 1 pi pi 105631 jul 26 14:52 hellopy.c -rw-r--r-- 1 pi pi 33 jul 26 14:43 hellopy.py $ gcc -Os -I /usr/include/python3.5m -o hellopy hellopy.c -lpython3.5m -lpthread -lm -lutil -ldl $ ls -la -rwxr-xr-x 1 pi pi 20576 jul 26 14:58 hellopy -rw-r--r-- 1 pi pi 105631 jul 26 14:52 hellopy.c -rw-r--r-- 1 pi pi 33 jul 26 14:43 hellopy.py $ ./hellopy Go ahead with Python!
  • 9.
    Desenvolvendo este estudo,eu encontrei a fonte onde havia lido que o Golang é uma linguagem de programação de sistemas concorrentes, foi aqui: https://www.ualr.edu/pxtang/papers/ACC10.pdf 12. Conclusão da parte 1 A comparação entre Python e Golang foi válida porque demonstrou o quão diferentes esses produtos são no presente estágio de maturidade. O Golang é uma linguagem de programação leve focada em concorrência. Python, por sua vez, é uma linguagem de programação robusta, focada em produtividade, legibilidade de código e com enorme capacidade em importar bibliotecas consagradas de terceiros, além de uma grande quantidade de frameworks disponíveis. O profissional diferenciado conhece as duas linguagens e aplica cada uma delas objetivando solucionar problemas distintos. Tenho bem mais experiência com Python do que com o Golang, o conhecimento adquirido até aqui com o Golang foi surpreendente e deixa uma boa impressão, além deste estudo ser um ótimo ponto de partida para todos nós. Bibliografia: Donovan, Alan A. A.; Kernighan, Brian W.; Tradução: Lúcia A. Kinoshita, A Linguagem de Programação Go, Editora Novatec, 2017 Gostou? Dê um like! Fique a vontade em compartilhar e usar no seu estudo de caso. Apenas informe a fonte. Obrigado e sucesso! Ahhh eu tenho uma lista de desejo na Amazon: I have a wishlist at Amazon https://www.amazon.com.br/hz/wishlist/ls/2Y2J3ADYO50TH Could you do me a kindness? :-) Marcos Aurelio Barranco SP/SP 6/Julho/2019 Atualizado em: 29/Agosto/2019