<span></span><span class="c1"># 真正实用的脚本应当使用非阻塞型定时器,</span>

    <span class="c1"># 这里我们使用阻塞型定时器是出于简单化考虑。</span>

    <span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">time</span>

    <span class="c1"># 创建定时器文件描述符</span>

    <span class="n">fd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">timerfd_create</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_REALTIME</span><span class="p">)</span>

    <span class="c1"># 在 1 秒种时启动定时器,间隔时间为半秒</span>

    <span class="n">os</span><span class="o">.</span><span class="n">timerfd_settime</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">initial</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>

    <span class="k">try</span><span class="p">:</span>

    <span class="c1"># 处理定时器事件四次。</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>

    <span class="c1"># read() 将会阻塞直到定时器过期</span>

    <span class="n">_</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>

    <span class="nb">print</span><span class="p">(</span><span class="s2">"Timer expired"</span><span class="p">)</span>

    <span class="k">finally</span><span class="p">:</span>

    <span class="c1"># 记住要关闭定时器文件描述符!</span>

    <span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>

    <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">time</span><span class="o">,</span><span class="w"> </span><span class="nn">select</span><span class="o">,</span><span class="w"> </span><span class="nn">socket</span><span class="o">,</span><span class="w"> </span><span class="nn">sys</span>

    <span class="c1"># 创建一个轮询对象</span>

    <span class="n">ep</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">epoll</span><span class="p">()</span>

    <span class="c1"># 在本例中,使用回环地址向服务器发送 "stop" 命令。</span>

    <span class="c1">#</span>

    <span class="c1"># $ telnet 127.0.0.1 1234</span>

    <span class="c1"># Trying 127.0.0.1…</span>

    <span class="c1"># Connected to 127.0.0.1.</span>

    <span class="c1"># Escape character is '^]'.</span>

    <span class="c1"># stop</span>

    <span class="c1"># Connection closed by foreign host.</span>

    <span class="c1">#</span>

    <span class="n">sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="s2">"127.0.0.1"</span><span class="p">,</span> <span class="mi">1234</span><span class="p">))</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

    <span class="n">ep</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">sock</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">)</span>

    <span class="c1"># 以非阻塞模式创建定时器文件描述符。</span>

    <span class="n">num</span> <span class="o">=</span> <span class="mi">3</span>

    <span class="n">fds</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>

    <span class="n">fd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">timerfd_create</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_REALTIME</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">TFD_NONBLOCK</span><span class="p">)</span>

    <span class="n">fds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>

    <span class="c1"># 注册定时器文件描述符用于读取事件</span>

    <span class="n">ep</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">)</span>

    <span class="c1"># 以纳秒精度的 os.timerfd_settime_ns() 启动定时器。</span>

    <span class="c1"># 定时器 1 间隔为 0.25 秒;定时器 2 间隔为 0.5 秒;依此类推</span>

    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">fd</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">fds</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>

    <span class="n">one_sec_in_nsec</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="mi">9</span>

    <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">*</span> <span class="n">one_sec_in_nsec</span>

    <span class="n">os</span><span class="o">.</span><span class="n">timerfd_settime_ns</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">initial</span><span class="o">=</span><span class="n">i</span><span class="o">//</span><span class="mi">4</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="n">i</span><span class="o">//</span><span class="mi">4</span><span class="p">)</span>

    <span class="n">timeout</span> <span class="o">=</span> <span class="mi">3</span>

    <span class="k">try</span><span class="p">:</span>

    <span class="n">conn</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="n">is_active</span> <span class="o">=</span> <span class="kc">True</span>

    <span class="k">while</span> <span class="n">is_active</span><span class="p">:</span>

    <span class="c1"># 等待定时器 3 秒到期。</span>

    <span class="c1"># epoll.poll() 返回一个 (fd, event) 对的列表。</span>

    <span class="c1"># fd 是一个文件描述符。</span>

    <span class="c1"># sock 和 conn[=socket.accept() 的返回值] 是套接字对象,而不是文件描述符。</span>

    <span class="c1"># 因此使用 sock.fileno() 和 conn.fileno() 来获取文件描述符。</span>

    <span class="n">events</span> <span class="o">=</span> <span class="n">ep</span><span class="o">.</span><span class="n">poll</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>

    <span class="c1"># 如果同时有多个定时器文件描述符准备读取,</span>

    <span class="c1"># epoll.poll() 将返回一个 (fd, event) 对的列表。</span>

    <span class="c1">#</span>

    <span class="c1"># 在本例的设置中,</span>

    <span class="c1"># 第 1 个定时器在 0.25 秒后间隔 0.25 秒启动。 (0.25, 0.5, 0.75, 1.0, …)</span>

    <span class="c1"># 第 2 个定时器在 0.5 秒后间隔 0.5 秒启动。 (0.5, 1.0, 1.5, 2.0, …)</span>

    <span class="c1"># 第 3 个定时器在 0.75 秒后间隔 0.75 秒启动。 (0.75, 1.5, 2.25, 3.0, …)</span>

    <span class="c1">#</span>

    <span class="c1"># 在 0.25 秒时,只有第 1 个定时器启动。</span>

    <span class="c1"># 在 0.5 秒时,第 1 个定时器和第 2 个定时器同时启动。</span>

    <span class="c1"># 在 0.75 秒时,第 1 个定时器和第 3 个定时器同时启动。</span>

    <span class="c1"># 在 1.5 秒时,第 1 个定时器、第 2 个定时器和第 3 个定时器同时启动。</span>

    <span class="c1">#</span>

    <span class="c1"># 如果一个定时器文件描述符自上次 os.read() 调用后</span>

    <span class="c1"># 多次发出信号,os.read() 将以主机的类字节顺序</span>

    <span class="c1"># 返回发出信号的次数。</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Signaled events=</span><span class="si">{</span><span class="n">events</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">fd</span><span class="p">,</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">events</span><span class="p">:</span>

    <span class="k">if</span> <span class="n">event</span> <span class="o">&</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">:</span>

    <span class="k">if</span> <span class="n">fd</span> <span class="o">==</span> <span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">():</span>

    <span class="c1"># 检查是否有连接请求。</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Accepting connection </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">conn</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">sock</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>

    <span class="n">conn</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Accepted connection </span><span class="si">{</span><span class="n">conn</span><span class="si">}</span><span class="s2"> from </span><span class="si">{</span><span class="n">addr</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">ep</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">)</span>

    <span class="k">elif</span> <span class="n">conn</span> <span class="ow">and</span> <span class="n">fd</span> <span class="o">==</span> <span class="n">conn</span><span class="o">.</span><span class="n">fileno</span><span class="p">():</span>

    <span class="c1"># 检查是否有数据要读取。</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Reading data </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">data</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">data</span><span class="p">:</span>

    <span class="c1"># 安全起见你应当捕获 UnicodeDecodeError 异常。</span>

    <span class="n">cmd</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">cmd</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"stop"</span><span class="p">):</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Stopping server"</span><span class="p">)</span>

    <span class="n">is_active</span> <span class="o">=</span> <span class="kc">False</span>

    <span class="k">else</span><span class="p">:</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown command: </span><span class="si">{</span><span class="n">cmd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="k">else</span><span class="p">:</span>

    <span class="c1"># 已无数据,关闭连接</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Closing connection </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">ep</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>

    <span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

    <span class="n">conn</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="k">elif</span> <span class="n">fd</span> <span class="ow">in</span> <span class="n">fds</span><span class="p">:</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Reading timer </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">count</span> <span class="o">=</span> <span class="nb">int</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="n">byteorder</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">byteorder</span><span class="p">)</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Timer </span><span class="si">{</span><span class="n">fds</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2"> expired </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2"> times"</span><span class="p">)</span>

    <span class="k">else</span><span class="p">:</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown file descriptor </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="k">finally</span><span class="p">:</span>

    <span class="k">for</span> <span class="n">fd</span> <span class="ow">in</span> <span class="n">fds</span><span class="p">:</span>

    <span class="n">ep</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>

    <span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>

    <span class="n">ep</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

    <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">time</span><span class="o">,</span><span class="w"> </span><span class="nn">select</span><span class="o">,</span><span class="w"> </span><span class="nn">socket</span><span class="o">,</span><span class="w"> </span><span class="nn">sys</span>

    <span class="c1"># 在本例中,使用回环地址向服务器发送 "stop" 命令。</span>

    <span class="c1">#</span>

    <span class="c1"># $ telnet 127.0.0.1 1234</span>

    <span class="c1"># Trying 127.0.0.1…</span>

    <span class="c1"># Connected to 127.0.0.1.</span>

    <span class="c1"># Escape character is '^]'.</span>

    <span class="c1"># stop</span>

    <span class="c1"># Connection closed by foreign host.</span>

    <span class="c1">#</span>

    <span class="n">sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="s2">"127.0.0.1"</span><span class="p">,</span> <span class="mi">1234</span><span class="p">))</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

    <span class="c1"># 以非阻塞模式创建定时器文件描述符。</span>

    <span class="n">num</span> <span class="o">=</span> <span class="mi">3</span>

    <span class="n">fds</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">timerfd_create</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_REALTIME</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">TFD_NONBLOCK</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">)]</span>

    <span class="n">select_fds</span> <span class="o">=</span> <span class="n">fds</span> <span class="o">+</span> <span class="p">[</span><span class="n">sock</span><span class="p">]</span>

    <span class="c1"># 使用 os.timerfd_settime() 启动指定秒数的定时器。</span>

    <span class="c1"># 定时器 1 间隔为 0.25 秒;定时器 2 间隔为 0.5 秒;依此类推</span>

    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">fd</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">fds</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>

    <span class="n">os</span><span class="o">.</span><span class="n">timerfd_settime</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">initial</span><span class="o">=</span><span class="n">i</span><span class="o">/</span><span class="mi">4</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="n">i</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span>

    <span class="n">timeout</span> <span class="o">=</span> <span class="mi">3</span>

    <span class="k">try</span><span class="p">:</span>

    <span class="n">conn</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="n">is_active</span> <span class="o">=</span> <span class="kc">True</span>

    <span class="k">while</span> <span class="n">is_active</span><span class="p">:</span>

    <span class="c1"># 等待定时器 3 秒到期。</span>

    <span class="c1"># select.select() 返回一个文件描述符或对象的列表。</span>

    <span class="n">rfd</span><span class="p">,</span> <span class="n">wfd</span><span class="p">,</span> <span class="n">xfd</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">select_fds</span><span class="p">,</span> <span class="n">select_fds</span><span class="p">,</span> <span class="n">select_fds</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">fd</span> <span class="ow">in</span> <span class="n">rfd</span><span class="p">:</span>

    <span class="k">if</span> <span class="n">fd</span> <span class="o">==</span> <span class="n">sock</span><span class="p">:</span>

    <span class="c1"># 检查是否有连接请求。</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Accepting connection </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">conn</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">sock</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>

    <span class="n">conn</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Accepted connection </span><span class="si">{</span><span class="n">conn</span><span class="si">}</span><span class="s2"> from </span><span class="si">{</span><span class="n">addr</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">select_fds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>

    <span class="k">elif</span> <span class="n">conn</span> <span class="ow">and</span> <span class="n">fd</span> <span class="o">==</span> <span class="n">conn</span><span class="p">:</span>

    <span class="c1"># 检查中否有数据要读取。</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Reading data </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">data</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">data</span><span class="p">:</span>

    <span class="c1"># 安全起见你应当捕获 UnicodeDecodeError 异常。</span>

    <span class="n">cmd</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">cmd</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"stop"</span><span class="p">):</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Stopping server"</span><span class="p">)</span>

    <span class="n">is_active</span> <span class="o">=</span> <span class="kc">False</span>

    <span class="k">else</span><span class="p">:</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown command: </span><span class="si">{</span><span class="n">cmd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="k">else</span><span class="p">:</span>

    <span class="c1"># 已无数据,关闭连接</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Closing connection </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">select_fds</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>

    <span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

    <span class="n">conn</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="k">elif</span> <span class="n">fd</span> <span class="ow">in</span> <span class="n">fds</span><span class="p">:</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Reading timer </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">count</span> <span class="o">=</span> <span class="nb">int</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="n">byteorder</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">byteorder</span><span class="p">)</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Timer </span><span class="si">{</span><span class="n">fds</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2"> expired </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2"> times"</span><span class="p">)</span>

    <span class="k">else</span><span class="p">:</span>

    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown file descriptor </span><span class="si">{</span><span class="n">fd</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="k">finally</span><span class="p">:</span>

    <span class="k">for</span> <span class="n">fd</span> <span class="ow">in</span> <span class="n">fds</span><span class="p">:</span>

    <span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>

    <span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

    <span class="n">sock</span> <span class="o">=</span> <span class="kc">None</span>