Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Tratamento de exceções em GO
1. Tratamento de Exceções na
Linguagem Go
Aluna:
Karla Polyana Silva Falcão
kpsf@cin.ufpe.br
Orientador:
Fernando J. Castor de Lima Filho
castor@cin.ufpe.br
Universidade Federal
de
Pernambuco
(UFPE)
Centro de Informática
(CIn)
2. Programação Concorrente
Programa Seqüencial em Go:
package main
import ("time";"fmt")
func a(msg string, sec int64){
time.Sleep(sec *1e9)
fmt.Println(msg)
}
func main(){
fmt.Println("Inicio...")
a("tea", 3)
a("coffee", 2)
time.Sleep(4e9)
fmt.Println("Fim...")
}
Programa Concorrente em Go:
package main
import ("time";"fmt")
func a(msg string, sec int64) {
time.Sleep(sec *1e9)
fmt.Println(msg)
}
func main(){
fmt.Println("Inicio...")
go a("tea", 3)
go a("coffee", 2)
time.Sleep(4e9)
fmt.Println("Fim...")
}
3. Problemas com Concorrência
#include <pthread.h>
#include <stdio.h>
int x=0;
void *f(void *threadid){
x++;
pthread_exit(NULL);
}
void *g(void *threadid){
x--;
pthread_exit(NULL);
}
int main (){
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, f, NULL);
pthread_create(&thread2, NULL, g, NULL);
printf("%dn",x);
pthread_exit(NULL);
}
Linguagem C
Problema :
Indeterminismo
- Qual o valor final de “x”?
Solução :
Uso de semáforos, mutexes,
monitores, etc.
4. Concorrência em Go
package main
import ("fmt")
var x int = 0
var c = make(chan int)
func main(){
go f()
go g()
fmt.Println(<-c)
}
func f() {
x++
c<-x
}
func g() {
x--
c<-x
}
Facilidade na criação de threads
(goroutines)
Sincronização
Sem dados compartilhados entre
threads (goroutines)
Linguagem Go
5. Por que Go?
Go é uma linguagem de programação
criada pela Google em setembro de
2009. Já em 2010 alcançou a décima
sexta posição, no ranking da TIOBE
Programming Community.
Go tem foco na facilidade de
programação, desempenho e
escalabilidade em ambiente multi-core,
como é o mundo hoje em dia.
6. Tratando Erros em Go
(Erros = Exceções)
package main
import ("fmt")
func f(){
div := 9/0
}
func main() {
f()
}
FONTE: http://images.sodahead.com/polls/000628299/polls_panic_attack_5656_707107_answer_5_xlarge.jpeg
7. package main
import ("fmt")
func f(){
div := 9/0
}
func main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
f()
}
go f()
Tratando Erros em Go
(Erros = Exceções)
FONTE: http://images.sodahead.com/polls/000628299/polls_panic_attack_5656_707107_answer_5_xlarge.jpeg
8. Problema (1)
package main
import ("fmt")
func main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
go f()
go g() //Pode entrar em pânico!
go h() //Pode entrar em pânico!
}
Se houver um erro não recuperado em uma
goroutine todas as outras no mesmo nível e
em níveis superiores morrem!
FONTE: http://kynas.blogs.sapo.pt/arquivo/2004_02.html
9. Problema (2)
package main
import ("fmt")
var c = make(chan int)
func f(){
time.sleep(3*1e9)
c<-x
}
func main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
go f()
<-c
}
FONTE: http://kynas.blogs.sapo.pt/arquivo/2004_02.html
Não há sincronização implícita entre as
goroutines!
10. Resolvendo o problema
package main
import ("fmt")
var c = make(chan int)
func f(){
div := 9/0
}
safunc main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
go f()
<-c
}
go func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
f()
c<-1
}()
Modificação no front-end GCCGO
Nova palavra reservada
- safunc ( Safe Function)
Injeção de Código
- Função anônima com tratador
- Canal para a sincronização
http://kynas.blogs.sapo.pt/arquivo/2004_02.html
11. Referências e agradecimentos
Agradecimentos :
À FACEPE e ao CNPq pelo financiamento da
pesquisa.
Ao meu orientador.
Referências :
Especificação da linguagem Go. End.:
www.golang.org.
Comunidade que indica a popularidade de
linguagens de programação. End.:
http://www.tiobe.com/index.php/content/paperinf
o/tpci/index.html.