-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrobustness.tex
More file actions
110 lines (95 loc) · 2.87 KB
/
Copy pathrobustness.tex
File metadata and controls
110 lines (95 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
\section{La robustesse}
\begin{frame}
\frametitle{La robustesse}
\framesubtitle{Introduction}
\begin{block}{Définition}
\begin{itemize}
\item tout peut arriver dans un programme :
\begin{itemize}
\item échec de calcul,
\item paramètre invalide,
\item processus mort,
\item \ldots
\end{itemize}
\item il faut pouvoir réagir et traiter ces problèmes
\item plusieurs mécanismes :
\begin{itemize}
\item les timeouts
\item la capture des erreurs
\end{itemize}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{La robustesse}
\framesubtitle{Timeout}
\begin{block}{Définition}
\begin{itemize}
\item lorsque l'on rentre dans une phase d'attente de message
(\textit{receive}), on est bloqué
\item on peut introduire des timeouts pour stopper l'attente (exprimée en
ms)
\end{itemize}
\end{block}
\begin{exampleblock}{Exemple}
\begin{lstlisting}[language=erlang]
loop() ->
receive
Message ->
io:format("Message received~n", []),
loop()
after 5000 ->
io:format("Timed out~n", [])
end.
\end{lstlisting}
\end{exampleblock}
\begin{alertblock}{Bonne pratique}
Le délai peut être une fonction.
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{La robustesse}
\framesubtitle{Capture des erreurs}
\begin{block}{Définition}
\begin{itemize}
\item par défaut, un processus erlang se termine par un
\textit{exit(normal)}
\item si une erreur survient, la fonction \textit{exit} est invoquée avec
un atome différent de \textit{normal}
\item deux processus peuvent être liés et donc un processus peut savoir si
un processus a échoué
\item pour prendre en compte les signaux exit dès leur création, il faut
déclarer une priorité spéciale : \texttt{process\_flag(trap\_exit, true)}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{La robustesse}
\framesubtitle{Capture des erreurs}
\begin{exampleblock}{Exemple}
\begin{itemize}
\item un porcessus se lie à un autre processus et possède une clause
conduisant à l'arrêt du processus avec un atome \textit{error}
\item dès emission d'un signal \textit{exit}, les processus liés sont
avertis
\begin{lstlisting}[language=erlang]
start() ->
link(another_processus_Pid).
process([]) ->
exit(error).
\end{lstlisting}
\item en cas d'erreur du premier processus, un signal est envoyé et capturé
par un \textit{receive}
\begin{lstlisting}[language=erlang]
loop() ->
receive
{message, Message} ->
io:format("Message received~n", []),
loop();
{'EXIT', From, Reason} ->
io:format("Exit: ~p~n", [{'EXIT', From, Reason}])
end.
\end{lstlisting}
\end{itemize}
\end{exampleblock}
\end{frame}