Files
hustoj/web/python-docs/library/selectors.html
2025-03-09 17:10:56 +08:00

522 lines
39 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>selectors --- 高级 I/O 复用库 &#8212; Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<script src="../_static/translations.js"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="在 Python 3.8.20 文档 中搜索"
href="../_static/opensearch.xml"/>
<link rel="author" title="关于这些文档" href="../about.html" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
<link rel="copyright" title="版权所有" href="../copyright.html" />
<link rel="next" title="asyncore --- 异步套接字处理器" href="asyncore.html" />
<link rel="prev" title="select --- 等待 I/O 完成" href="select.html" />
<link rel="canonical" href="https://docs.python.org/3/library/selectors.html" />
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<nav class="nav-content" role="navigation">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Logo"/>
</a>
<div class="version_switcher_placeholder"></div>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero"
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
</svg>
<input type="text" name="q" aria-label="快速搜索"/>
<input type="submit" value="转向"/>
</form>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">selectors</span></code> --- 高级 I/O 复用库</a><ul>
<li><a class="reference internal" href="#introduction">概述</a></li>
<li><a class="reference internal" href="#classes"></a></li>
<li><a class="reference internal" href="#examples">例子</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="select.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">select</span></code> --- 等待 I/O 完成</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="asyncore.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code> --- 异步套接字处理器</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/selectors.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
这个文档所针对的是一个已不再受支持的 Python 旧版本。
你应当升级版本,并阅读
<a href="/3/library/selectors.html"> Python 当前稳定版本的文档</a>.
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
accesskey="I">索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="asyncore.html" title="asyncore --- 异步套接字处理器"
accesskey="N">下一页</a> |</li>
<li class="right" >
<a href="select.html" title="select --- 等待 I/O 完成"
accesskey="P">上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="ipc.html" accesskey="U">网络和进程间通信</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-selectors">
<span id="selectors-high-level-i-o-multiplexing"></span><h1><a class="reference internal" href="#module-selectors" title="selectors: High-level I/O multiplexing."><code class="xref py py-mod docutils literal notranslate"><span class="pre">selectors</span></code></a> --- 高级 I/O 复用库<a class="headerlink" href="#module-selectors" title="永久链接至标题"></a></h1>
<div class="versionadded">
<p><span class="versionmodified added">3.4 新版功能.</span></p>
</div>
<p><strong>源码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/selectors.py">Lib/selectors.py</a></p>
<hr class="docutils" />
<section id="introduction">
<h2>概述<a class="headerlink" href="#introduction" title="永久链接至标题"></a></h2>
<p>此模块允许高层级且高效率的 I/O 复用,它建立在 <a class="reference internal" href="select.html#module-select" title="select: Wait for I/O completion on multiple streams."><code class="xref py py-mod docutils literal notranslate"><span class="pre">select</span></code></a> 模块原型的基础之上。 推荐用户改用此模块,除非他们希望对所使用的 OS 层级原型进行精确控制。</p>
<p>它定义了一个 <a class="reference internal" href="#selectors.BaseSelector" title="selectors.BaseSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseSelector</span></code></a> 抽象基类,以及多个实际的实现 (<a class="reference internal" href="#selectors.KqueueSelector" title="selectors.KqueueSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">KqueueSelector</span></code></a>, <a class="reference internal" href="#selectors.EpollSelector" title="selectors.EpollSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">EpollSelector</span></code></a>...),它们可被用于在多个文件对象上等待 I/O 就绪通知。 在下文中,&quot;文件对象&quot; 是指任何具有 <code class="xref py py-meth docutils literal notranslate"><span class="pre">fileno()</span></code> 方法的对象,或是一个原始文件描述器。 参见 <a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file object</span></a></p>
<p><a class="reference internal" href="#selectors.DefaultSelector" title="selectors.DefaultSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">DefaultSelector</span></code></a> 是一个指向当前平台上可用的最高效实现的别名:这应为大多数用户的默认选择。</p>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p>受支持的文件对象类型取决于具体平台:在 Windows 上,支持套接字但不支持管道,而在 Unix 上两者均受支持(某些其他类型也可能受支持,例如 fifo 或特殊文件设备等)。</p>
</div>
<div class="admonition seealso">
<p class="admonition-title">参见</p>
<dl class="simple">
<dt><a class="reference internal" href="select.html#module-select" title="select: Wait for I/O completion on multiple streams."><code class="xref py py-mod docutils literal notranslate"><span class="pre">select</span></code></a></dt><dd><p>低层级的 I/O 多路复用模块。</p>
</dd>
</dl>
</div>
</section>
<section id="classes">
<h2><a class="headerlink" href="#classes" title="永久链接至标题"></a></h2>
<p>类的层次结构:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">BaseSelector</span>
<span class="o">+--</span> <span class="n">SelectSelector</span>
<span class="o">+--</span> <span class="n">PollSelector</span>
<span class="o">+--</span> <span class="n">EpollSelector</span>
<span class="o">+--</span> <span class="n">DevpollSelector</span>
<span class="o">+--</span> <span class="n">KqueueSelector</span>
</pre></div>
</div>
<p>下文中,<em>events</em> 一个位掩码,指明哪些 I/O 事件要在给定的文件对象上执行等待。 它可以是以下模块级常量的组合:</p>
<blockquote>
<div><table class="docutils align-default">
<colgroup>
<col style="width: 33%" />
<col style="width: 67%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>常数</p></th>
<th class="head"><p>含义</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="xref py py-const docutils literal notranslate"><span class="pre">EVENT_READ</span></code></p></td>
<td><p>可读</p></td>
</tr>
<tr class="row-odd"><td><p><code class="xref py py-const docutils literal notranslate"><span class="pre">EVENT_WRITE</span></code></p></td>
<td><p>可写</p></td>
</tr>
</tbody>
</table>
</div></blockquote>
<dl class="class">
<dt id="selectors.SelectorKey">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">SelectorKey</code><a class="headerlink" href="#selectors.SelectorKey" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 是一个 <a class="reference internal" href="collections.html#collections.namedtuple" title="collections.namedtuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">namedtuple</span></code></a>,用来将文件对象关联到其下层的文件描述器、选定事件掩码和附加数据等。 它会被某些 <a class="reference internal" href="#selectors.BaseSelector" title="selectors.BaseSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseSelector</span></code></a> 方法返回。</p>
<dl class="attribute">
<dt id="selectors.SelectorKey.fileobj">
<code class="sig-name descname">fileobj</code><a class="headerlink" href="#selectors.SelectorKey.fileobj" title="永久链接至目标"></a></dt>
<dd><p>已注册的文件对象。</p>
</dd></dl>
<dl class="attribute">
<dt id="selectors.SelectorKey.fd">
<code class="sig-name descname">fd</code><a class="headerlink" href="#selectors.SelectorKey.fd" title="永久链接至目标"></a></dt>
<dd><p>下层的文件描述器。</p>
</dd></dl>
<dl class="attribute">
<dt id="selectors.SelectorKey.events">
<code class="sig-name descname">events</code><a class="headerlink" href="#selectors.SelectorKey.events" title="永久链接至目标"></a></dt>
<dd><p>必须在此文件对象上被等待的事件。</p>
</dd></dl>
<dl class="attribute">
<dt id="selectors.SelectorKey.data">
<code class="sig-name descname">data</code><a class="headerlink" href="#selectors.SelectorKey.data" title="永久链接至目标"></a></dt>
<dd><p>可选的关联到此文件对象的不透明数据:例如,这可被用来存储各个客户端的会话 ID。</p>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="selectors.BaseSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">BaseSelector</code><a class="headerlink" href="#selectors.BaseSelector" title="永久链接至目标"></a></dt>
<dd><p>一个 <a class="reference internal" href="#selectors.BaseSelector" title="selectors.BaseSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseSelector</span></code></a>,用来在多个文件对象上等待 I/O 事件就绪。 它支持文件流注册、注销,以及在这些流上等待 I/O 事件的方法。 它是一个抽象基类,因此不能被实例化。 请改用 <a class="reference internal" href="#selectors.DefaultSelector" title="selectors.DefaultSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">DefaultSelector</span></code></a>,或者 <a class="reference internal" href="#selectors.SelectSelector" title="selectors.SelectSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectSelector</span></code></a>, <a class="reference internal" href="#selectors.KqueueSelector" title="selectors.KqueueSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">KqueueSelector</span></code></a> 等。 如果你想要指明使用某个实现,并且你的平台支持它的话。 <a class="reference internal" href="#selectors.BaseSelector" title="selectors.BaseSelector"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseSelector</span></code></a> 及其具体实现支持 <a class="reference internal" href="../glossary.html#term-context-manager"><span class="xref std std-term">context manager</span></a> 协议。</p>
<dl class="method">
<dt id="selectors.BaseSelector.register">
<em class="property">abstractmethod </em><code class="sig-name descname">register</code><span class="sig-paren">(</span><em class="sig-param">fileobj</em>, <em class="sig-param">events</em>, <em class="sig-param">data=None</em><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.register" title="永久链接至目标"></a></dt>
<dd><p>注册一个用于选择的文件对象,在其上监视 I/O 事件。</p>
<p><em>fileobj</em> 是要监视的文件对象。 它可以是整数形式的文件描述符或者具有 <code class="docutils literal notranslate"><span class="pre">fileno()</span></code> 方法的对象。 <em>events</em> 是要监视的事件的位掩码。 <em>data</em> 是一个不透明对象。</p>
<p>这将返回一个新的 <a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 实例,或在出现无效事件掩码或文件描述符时引发 <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>,或在文件对象已被注册时引发 <a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a></p>
</dd></dl>
<dl class="method">
<dt id="selectors.BaseSelector.unregister">
<em class="property">abstractmethod </em><code class="sig-name descname">unregister</code><span class="sig-paren">(</span><em class="sig-param">fileobj</em><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.unregister" title="永久链接至目标"></a></dt>
<dd><p>注销对一个文件对象的选择,移除对它的监视。 在文件对象被关闭之前应当先将其注销。</p>
<p><em>fileobj</em> 必须是之前已注册的文件对象。</p>
<p>这将返回已关联的 <a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 实例,或者如果 <em>fileobj</em> 未注册则会引发 <a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a>。 It will raise <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> 如果 <em>fileobj</em> 无效(例如它没有 <code class="docutils literal notranslate"><span class="pre">fileno()</span></code> 方法或其 <code class="docutils literal notranslate"><span class="pre">fileno()</span></code> 方法返回无效值)。</p>
</dd></dl>
<dl class="method">
<dt id="selectors.BaseSelector.modify">
<code class="sig-name descname">modify</code><span class="sig-paren">(</span><em class="sig-param">fileobj</em>, <em class="sig-param">events</em>, <em class="sig-param">data=None</em><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.modify" title="永久链接至目标"></a></dt>
<dd><p>更改已注册文件对象所监视的事件或所附带的数据。</p>
<p>这等价于 <code class="xref py py-meth docutils literal notranslate"><span class="pre">BaseSelector.unregister(fileobj)()</span></code><code class="xref py py-meth docutils literal notranslate"><span class="pre">BaseSelector.register(fileobj,</span> <span class="pre">events,</span> <span class="pre">data)()</span></code>,区别在于它可以被更高效地实现。</p>
<p>这将返回一个新的 <a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 实例,或在出现无效事件掩码或文件描述符时引发 <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>,或在文件对象未被注册时引发 <a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a></p>
</dd></dl>
<dl class="method">
<dt id="selectors.BaseSelector.select">
<em class="property">abstractmethod </em><code class="sig-name descname">select</code><span class="sig-paren">(</span><em class="sig-param">timeout=None</em><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.select" title="永久链接至目标"></a></dt>
<dd><p>等待直到有已注册的文件对象就绪,或是超过时限。</p>
<p>如果 <code class="docutils literal notranslate"><span class="pre">timeout</span> <span class="pre">&gt;</span> <span class="pre">0</span></code>,这指定以秒数表示的最大等待时间。 如果 <code class="docutils literal notranslate"><span class="pre">timeout</span> <span class="pre">&lt;=</span> <span class="pre">0</span></code>,调用将不会阻塞,并将报告当前就绪的文件对象。 如果 <em>timeout</em><code class="docutils literal notranslate"><span class="pre">None</span></code>,调用将阻塞直到某个被监视的文件对象就绪。</p>
<p>这将返回由 <code class="docutils literal notranslate"><span class="pre">(key,</span> <span class="pre">events)</span></code> 元组构成的列表,每项各表示一个就绪的文件对象。</p>
<p><em>key</em> 是对应于就绪文件对象的 <a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 实例。 <em>events</em> 是在此文件对象上等待的事件位掩码。</p>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p>如果当前进程收到一个信号,此方法可在任何文件对象就绪之前或超出时限时返回:在此情况下,将返回一个空列表。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>现在当被某个信号中断时,如果信号处理程序没有引发异常,选择器会用重新计算的超时值进行重试(请查看 <span class="target" id="index-2"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0475"><strong>PEP 475</strong></a> 其理由),而不是在超时之前返回空的事件列表。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="selectors.BaseSelector.close">
<code class="sig-name descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.close" title="永久链接至目标"></a></dt>
<dd><p>关闭选择器。</p>
<p>必须调用这个方法以确保下层资源会被释放。 选择器被关闭后将不可再使用。</p>
</dd></dl>
<dl class="method">
<dt id="selectors.BaseSelector.get_key">
<code class="sig-name descname">get_key</code><span class="sig-paren">(</span><em class="sig-param">fileobj</em><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.get_key" title="永久链接至目标"></a></dt>
<dd><p>返回关联到某个已注册文件对象的键。</p>
<p>此方法将返回关联到文件对象的 <a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 实例,或在文件对象未注册时引发 <a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a></p>
</dd></dl>
<dl class="method">
<dt id="selectors.BaseSelector.get_map">
<em class="property">abstractmethod </em><code class="sig-name descname">get_map</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#selectors.BaseSelector.get_map" title="永久链接至目标"></a></dt>
<dd><p>返回从文件对象到选择器键的映射。</p>
<p>这将返回一个将已注册文件对象映射到与其相关联的 <a class="reference internal" href="#selectors.SelectorKey" title="selectors.SelectorKey"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorKey</span></code></a> 实例的 <a class="reference internal" href="collections.abc.html#collections.abc.Mapping" title="collections.abc.Mapping"><code class="xref py py-class docutils literal notranslate"><span class="pre">Mapping</span></code></a> 实例。</p>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="selectors.DefaultSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">DefaultSelector</code><a class="headerlink" href="#selectors.DefaultSelector" title="永久链接至目标"></a></dt>
<dd><p>默认的选择器类,使用当前平台上可用的最高效实现。 这应为大多数用户的默认选择。</p>
</dd></dl>
<dl class="class">
<dt id="selectors.SelectSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">SelectSelector</code><a class="headerlink" href="#selectors.SelectSelector" title="永久链接至目标"></a></dt>
<dd><p>基于 <a class="reference internal" href="select.html#select.select" title="select.select"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.select()</span></code></a> 的选择器。</p>
</dd></dl>
<dl class="class">
<dt id="selectors.PollSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">PollSelector</code><a class="headerlink" href="#selectors.PollSelector" title="永久链接至目标"></a></dt>
<dd><p>基于 <a class="reference internal" href="select.html#select.poll" title="select.poll"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.poll()</span></code></a> 的选择器。</p>
</dd></dl>
<dl class="class">
<dt id="selectors.EpollSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">EpollSelector</code><a class="headerlink" href="#selectors.EpollSelector" title="永久链接至目标"></a></dt>
<dd><p>基于 <a class="reference internal" href="select.html#select.epoll" title="select.epoll"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.epoll()</span></code></a> 的选择器。</p>
<dl class="method">
<dt id="selectors.EpollSelector.fileno">
<code class="sig-name descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#selectors.EpollSelector.fileno" title="永久链接至目标"></a></dt>
<dd><p>此方法将返回由下层 <a class="reference internal" href="select.html#select.epoll" title="select.epoll"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.epoll()</span></code></a> 对象所使用的文件描述符。</p>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="selectors.DevpollSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">DevpollSelector</code><a class="headerlink" href="#selectors.DevpollSelector" title="永久链接至目标"></a></dt>
<dd><p>基于 <a class="reference internal" href="select.html#select.devpoll" title="select.devpoll"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.devpoll()</span></code></a> 的选择器。</p>
<dl class="method">
<dt id="selectors.DevpollSelector.fileno">
<code class="sig-name descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#selectors.DevpollSelector.fileno" title="永久链接至目标"></a></dt>
<dd><p>此方法将返回由下层 <a class="reference internal" href="select.html#select.devpoll" title="select.devpoll"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.devpoll()</span></code></a> 对象所使用的文件描述符。</p>
</dd></dl>
<div class="versionadded">
<p><span class="versionmodified added">3.5 新版功能.</span></p>
</div>
</dd></dl>
<dl class="class">
<dt id="selectors.KqueueSelector">
<em class="property">class </em><code class="sig-prename descclassname">selectors.</code><code class="sig-name descname">KqueueSelector</code><a class="headerlink" href="#selectors.KqueueSelector" title="永久链接至目标"></a></dt>
<dd><p>基于 <a class="reference internal" href="select.html#select.kqueue" title="select.kqueue"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.kqueue()</span></code></a> 的选择器。</p>
<dl class="method">
<dt id="selectors.KqueueSelector.fileno">
<code class="sig-name descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#selectors.KqueueSelector.fileno" title="永久链接至目标"></a></dt>
<dd><p>此方法将返回由下层 <a class="reference internal" href="select.html#select.kqueue" title="select.kqueue"><code class="xref py py-func docutils literal notranslate"><span class="pre">select.kqueue()</span></code></a> 对象所使用的文件描述符。</p>
</dd></dl>
</dd></dl>
</section>
<section id="examples">
<h2>例子<a class="headerlink" href="#examples" title="永久链接至标题"></a></h2>
<p>下面是一个简单的回显服务器实现:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">selectors</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="n">sel</span> <span class="o">=</span> <span class="n">selectors</span><span class="o">.</span><span class="n">DefaultSelector</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">accept</span><span class="p">(</span><span class="n">sock</span><span class="p">,</span> <span class="n">mask</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="c1"># Should be ready</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;accepted&#39;</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="s1">&#39;from&#39;</span><span class="p">,</span> <span class="n">addr</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="n">sel</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">selectors</span><span class="o">.</span><span class="n">EVENT_READ</span><span class="p">,</span> <span class="n">read</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="n">mask</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">1000</span><span class="p">)</span> <span class="c1"># Should be ready</span>
<span class="k">if</span> <span class="n">data</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;echoing&#39;</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="s1">&#39;to&#39;</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">send</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="c1"># Hope it won&#39;t block</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;closing&#39;</span><span class="p">,</span> <span class="n">conn</span><span class="p">)</span>
<span class="n">sel</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">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">sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="s1">&#39;localhost&#39;</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">listen</span><span class="p">(</span><span class="mi">100</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">sel</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">selectors</span><span class="o">.</span><span class="n">EVENT_READ</span><span class="p">,</span> <span class="n">accept</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">events</span> <span class="o">=</span> <span class="n">sel</span><span class="o">.</span><span class="n">select</span><span class="p">()</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">mask</span> <span class="ow">in</span> <span class="n">events</span><span class="p">:</span>
<span class="n">callback</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">data</span>
<span class="n">callback</span><span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">fileobj</span><span class="p">,</span> <span class="n">mask</span><span class="p">)</span>
</pre></div>
</div>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">selectors</span></code> --- 高级 I/O 复用库</a><ul>
<li><a class="reference internal" href="#introduction">概述</a></li>
<li><a class="reference internal" href="#classes"></a></li>
<li><a class="reference internal" href="#examples">例子</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="select.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">select</span></code> --- 等待 I/O 完成</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="asyncore.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code> --- 异步套接字处理器</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/selectors.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
>索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="asyncore.html" title="asyncore --- 异步套接字处理器"
>下一页</a> |</li>
<li class="right" >
<a href="select.html" title="select --- 等待 I/O 完成"
>上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="ipc.html" >网络和进程间通信</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="footer">
&copy; <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
最后更新于 12月 09, 2024.
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
<br />
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
</div>
</body>
</html>