\chapter{异步通信}
人类拥有的大多数交流都是同步的。 一个说，一个听。 如果他们无秩序地谈话，那将是一场争吵。

但是实际上，大多数基于计算机的通信系统都是异步的。 即使它们看起来是同步的，也并非如此。 通信传输过程需要时间，因此这个世界上没有100％的实时性。

在本章中，我们将讨论可在Python中使用的异步操作，以便我们稍后可以使用它来构建通信系统。

\section{asyncio}
\textbf{asyncio}\cite{asyncio}是用于制作异步程序的Python库。


\subsection{一个简单的例子}
\lstinputlisting[language=Python]{data/codes/4/1asyncio_example.py}

\noindent 
输出是:

\begin{lstlisting}
Hello ...
... World!
\end{lstlisting}

从以上结果可以看出，即使将function2放在function1之前，程序仍会先打印出function1字符串“ Hello”，然后打印出function2字符串“ World”。

出这个结果，是因为两个函数同时启动，function1的延迟时间比function2的延迟短，1小于2。

\section{一个简单的服务器和客户端程序}
\subsection{服务器}
\lstinputlisting[language=Python]{data/codes/4/2asyncio_streams_server.py}

\subsection{客户端}
\lstinputlisting[language=Python]{data/codes/4/2asyncio_streams_client.py}

\subsection{总结}
所有这些代码背后的基本思想与我们之前看到的相同。

首先，我们必须创建一个服务器，该服务器定义了我们希望客户端连接的IP地址和端口。

然后，我们创建一个不断访问IP地址以建立连接的客户端，通过该连接，我们可以发送消息并从双方接收消息。

\section{是否保持连接}
大多数人以为他们的通讯连接一直都在，但事实并非如此。

没有任何连接是永远存在的。 因为我们正在使用Internet。 Internet本身是基于数据包的，这意味着基于Internet传输的所有内容都应进行拆分，并按部分交付。

这就是数字通信或现代通信的工作方式，他们不会一直保持连接状态，但是他们尝试尽可能频繁地连接服务器。

就像，如果客户端每1秒连接一次服务器以获取信息。 对于一个人去获得不重要的消息就足够了。

我说不重要是因为没有人可以在1秒钟内采取大动作。 因此，延迟1秒对人类而言并不重要。