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

500 lines
34 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>策略 &#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="平台支持" href="asyncio-platforms.html" />
<link rel="prev" title="传输和协议" href="asyncio-protocol.html" />
<link rel="canonical" href="https://docs.python.org/3/library/asyncio-policy.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="#">策略</a><ul>
<li><a class="reference internal" href="#getting-and-setting-the-policy">获取和设置策略</a></li>
<li><a class="reference internal" href="#policy-objects">策略对象</a></li>
<li><a class="reference internal" href="#process-watchers">进程监视器</a></li>
<li><a class="reference internal" href="#custom-policies">自定义策略</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="asyncio-protocol.html"
title="上一章">传输和协议</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="asyncio-platforms.html"
title="下一章">平台支持</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/asyncio-policy.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/asyncio-policy.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="asyncio-platforms.html" title="平台支持"
accesskey="N">下一页</a> |</li>
<li class="right" >
<a href="asyncio-protocol.html" title="传输和协议"
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" >网络和进程间通信</a> &#187;</li>
<li class="nav-item nav-item-3"><a href="asyncio.html" accesskey="U"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code> --- 异步 I/O</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="policies">
<span id="asyncio-policies"></span><h1>策略<a class="headerlink" href="#policies" title="永久链接至标题"></a></h1>
<p>事件循环策略是各个进程的全局对象 它控制事件循环的管理。每个事件循环都有一个默认策略可以使用策略API更改和定制该策略。</p>
<p>策略定义了“上下文”的概念,每个上下文管理一个单独的事件循环。默认策略将*context*定义为当前线程。</p>
<p>通过使用自定义事件循环策略,可以自定义 <a class="reference internal" href="asyncio-eventloop.html#asyncio.get_event_loop" title="asyncio.get_event_loop"><code class="xref py py-func docutils literal notranslate"><span class="pre">get_event_loop()</span></code></a><a class="reference internal" href="asyncio-eventloop.html#asyncio.set_event_loop" title="asyncio.set_event_loop"><code class="xref py py-func docutils literal notranslate"><span class="pre">set_event_loop()</span></code></a><a class="reference internal" href="asyncio-eventloop.html#asyncio.new_event_loop" title="asyncio.new_event_loop"><code class="xref py py-func docutils literal notranslate"><span class="pre">new_event_loop()</span></code></a> 函数的行为。</p>
<p>策略对象应该实现 <a class="reference internal" href="#asyncio.AbstractEventLoopPolicy" title="asyncio.AbstractEventLoopPolicy"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractEventLoopPolicy</span></code></a> 抽象基类中定义的API。</p>
<section id="getting-and-setting-the-policy">
<h2>获取和设置策略<a class="headerlink" href="#getting-and-setting-the-policy" title="永久链接至标题"></a></h2>
<p>可以使用下面函数获取和设置当前进程的策略:</p>
<dl class="function">
<dt id="asyncio.get_event_loop_policy">
<code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">get_event_loop_policy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.get_event_loop_policy" title="永久链接至目标"></a></dt>
<dd><p>返回当前进程域的策略。</p>
</dd></dl>
<dl class="function">
<dt id="asyncio.set_event_loop_policy">
<code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">set_event_loop_policy</code><span class="sig-paren">(</span><em class="sig-param">policy</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.set_event_loop_policy" title="永久链接至目标"></a></dt>
<dd><p><em>policy</em> 设置为当前进程域策略。</p>
<p>如果 <em>policy</em> 设为 <code class="docutils literal notranslate"><span class="pre">None</span></code> 将恢复默认策略。</p>
</dd></dl>
</section>
<section id="policy-objects">
<h2>策略对象<a class="headerlink" href="#policy-objects" title="永久链接至标题"></a></h2>
<p>抽象事件循环策略基类定义如下:</p>
<dl class="class">
<dt id="asyncio.AbstractEventLoopPolicy">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">AbstractEventLoopPolicy</code><a class="headerlink" href="#asyncio.AbstractEventLoopPolicy" title="永久链接至目标"></a></dt>
<dd><p>异步策略的抽象基类。</p>
<dl class="method">
<dt id="asyncio.AbstractEventLoopPolicy.get_event_loop">
<code class="sig-name descname">get_event_loop</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractEventLoopPolicy.get_event_loop" title="永久链接至目标"></a></dt>
<dd><p>为当前上下文获取事件循环。</p>
<p>返回一个实现 <a class="reference internal" href="asyncio-eventloop.html#asyncio.AbstractEventLoop" title="asyncio.AbstractEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractEventLoop</span></code></a> 接口的事件循环对象。</p>
<p>该方法永远不应返回 <code class="docutils literal notranslate"><span class="pre">None</span></code></p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.6 版更改.</span></p>
</div>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractEventLoopPolicy.set_event_loop">
<code class="sig-name descname">set_event_loop</code><span class="sig-paren">(</span><em class="sig-param">loop</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractEventLoopPolicy.set_event_loop" title="永久链接至目标"></a></dt>
<dd><p>将当前上下文的事件循环设置为 <em>loop</em></p>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractEventLoopPolicy.new_event_loop">
<code class="sig-name descname">new_event_loop</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractEventLoopPolicy.new_event_loop" title="永久链接至目标"></a></dt>
<dd><p>创建并返回一个新的事件循环对象。</p>
<p>该方法永远不应返回 <code class="docutils literal notranslate"><span class="pre">None</span></code></p>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractEventLoopPolicy.get_child_watcher">
<code class="sig-name descname">get_child_watcher</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractEventLoopPolicy.get_child_watcher" title="永久链接至目标"></a></dt>
<dd><p>获取子进程监视器对象。</p>
<p>返回一个实现 <a class="reference internal" href="#asyncio.AbstractChildWatcher" title="asyncio.AbstractChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractChildWatcher</span></code></a> 接口的监视器对象。</p>
<p>该函数仅支持Unix。</p>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractEventLoopPolicy.set_child_watcher">
<code class="sig-name descname">set_child_watcher</code><span class="sig-paren">(</span><em class="sig-param">watcher</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractEventLoopPolicy.set_child_watcher" title="永久链接至目标"></a></dt>
<dd><p>将当前子进程监视器设置为 <em>watcher</em></p>
<p>该函数仅支持Unix。</p>
</dd></dl>
</dd></dl>
<p>asyncio附带下列内置策略:</p>
<dl class="class">
<dt id="asyncio.DefaultEventLoopPolicy">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">DefaultEventLoopPolicy</code><a class="headerlink" href="#asyncio.DefaultEventLoopPolicy" title="永久链接至目标"></a></dt>
<dd><p>默认的 asyncio 策略。 在 Unix 上使用 <a class="reference internal" href="asyncio-eventloop.html#asyncio.SelectorEventLoop" title="asyncio.SelectorEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorEventLoop</span></code></a> 而在 Windows 上使用 <a class="reference internal" href="asyncio-eventloop.html#asyncio.ProactorEventLoop" title="asyncio.ProactorEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProactorEventLoop</span></code></a></p>
<p>不需要手动安装默认策略。asyncio已配置成自动使用默认策略。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.8 版更改: </span>在 Windows 上,现在默认会使用 <a class="reference internal" href="asyncio-eventloop.html#asyncio.ProactorEventLoop" title="asyncio.ProactorEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProactorEventLoop</span></code></a></p>
</div>
</dd></dl>
<dl class="class">
<dt id="asyncio.WindowsSelectorEventLoopPolicy">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">WindowsSelectorEventLoopPolicy</code><a class="headerlink" href="#asyncio.WindowsSelectorEventLoopPolicy" title="永久链接至目标"></a></dt>
<dd><p>一个使用 <a class="reference internal" href="asyncio-eventloop.html#asyncio.SelectorEventLoop" title="asyncio.SelectorEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">SelectorEventLoop</span></code></a> 事件循环实现的替代事件循环策略。</p>
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Windows。</p>
</dd></dl>
<dl class="class">
<dt id="asyncio.WindowsProactorEventLoopPolicy">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">WindowsProactorEventLoopPolicy</code><a class="headerlink" href="#asyncio.WindowsProactorEventLoopPolicy" title="永久链接至目标"></a></dt>
<dd><p>使用 <a class="reference internal" href="asyncio-eventloop.html#asyncio.ProactorEventLoop" title="asyncio.ProactorEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProactorEventLoop</span></code></a> 事件循环实现的另一种事件循环策略。</p>
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Windows。</p>
</dd></dl>
</section>
<section id="process-watchers">
<span id="asyncio-watchers"></span><h2>进程监视器<a class="headerlink" href="#process-watchers" title="永久链接至标题"></a></h2>
<p>进程监视器允许定制事件循环如何监视Unix子进程。具体来说事件循环需要知道子进程何时退出。</p>
<p>在asyncio中子进程由 <a class="reference internal" href="asyncio-subprocess.html#asyncio.create_subprocess_exec" title="asyncio.create_subprocess_exec"><code class="xref py py-func docutils literal notranslate"><span class="pre">create_subprocess_exec()</span></code></a><a class="reference internal" href="asyncio-eventloop.html#asyncio.loop.subprocess_exec" title="asyncio.loop.subprocess_exec"><code class="xref py py-meth docutils literal notranslate"><span class="pre">loop.subprocess_exec()</span></code></a> 函数创建。</p>
<p>asyncio 定义了 <a class="reference internal" href="#asyncio.AbstractChildWatcher" title="asyncio.AbstractChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractChildWatcher</span></code></a> 抽象基类,子监视器必须要实现它,并具有四种不同实现: <a class="reference internal" href="#asyncio.ThreadedChildWatcher" title="asyncio.ThreadedChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThreadedChildWatcher</span></code></a> (已配置为默认使用), <a class="reference internal" href="#asyncio.MultiLoopChildWatcher" title="asyncio.MultiLoopChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">MultiLoopChildWatcher</span></code></a>, <a class="reference internal" href="#asyncio.SafeChildWatcher" title="asyncio.SafeChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">SafeChildWatcher</span></code></a><a class="reference internal" href="#asyncio.FastChildWatcher" title="asyncio.FastChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">FastChildWatcher</span></code></a></p>
<p>请参阅 <a class="reference internal" href="asyncio-subprocess.html#asyncio-subprocess-threads"><span class="std std-ref">子进程和线程</span></a> 部分。</p>
<p>以下两个函数可用于自定义子进程监视器实现它将被asyncio事件循环使用:</p>
<dl class="function">
<dt id="asyncio.get_child_watcher">
<code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">get_child_watcher</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.get_child_watcher" title="永久链接至目标"></a></dt>
<dd><p>返回当前策略的当前子监视器。</p>
</dd></dl>
<dl class="function">
<dt id="asyncio.set_child_watcher">
<code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">set_child_watcher</code><span class="sig-paren">(</span><em class="sig-param">watcher</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.set_child_watcher" title="永久链接至目标"></a></dt>
<dd><p>将当前策略的子监视器设置为 <em>watcher</em><em>watcher</em> 必须实现 <a class="reference internal" href="#asyncio.AbstractChildWatcher" title="asyncio.AbstractChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractChildWatcher</span></code></a> 基类定义的方法。</p>
</dd></dl>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p>第三方事件循环实现可能不支持自定义子监视器。对于这样的事件循环,禁止使用 <a class="reference internal" href="#asyncio.set_child_watcher" title="asyncio.set_child_watcher"><code class="xref py py-func docutils literal notranslate"><span class="pre">set_child_watcher()</span></code></a> 或不起作用。</p>
</div>
<dl class="class">
<dt id="asyncio.AbstractChildWatcher">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">AbstractChildWatcher</code><a class="headerlink" href="#asyncio.AbstractChildWatcher" title="永久链接至目标"></a></dt>
<dd><dl class="method">
<dt id="asyncio.AbstractChildWatcher.add_child_handler">
<code class="sig-name descname">add_child_handler</code><span class="sig-paren">(</span><em class="sig-param">pid</em>, <em class="sig-param">callback</em>, <em class="sig-param">*args</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractChildWatcher.add_child_handler" title="永久链接至目标"></a></dt>
<dd><p>注册一个新的子处理回调函数。</p>
<p>安排 <code class="docutils literal notranslate"><span class="pre">callback(pid,</span> <span class="pre">returncode,</span> <span class="pre">*args)</span></code> 在进程的PID与 <em>pid</em> 相等时调用。指定另一个同进程的回调函数替换之前的回调处理函数。</p>
<p>回调函数 <em>callback</em> 必须是线程安全。</p>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractChildWatcher.remove_child_handler">
<code class="sig-name descname">remove_child_handler</code><span class="sig-paren">(</span><em class="sig-param">pid</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractChildWatcher.remove_child_handler" title="永久链接至目标"></a></dt>
<dd><p>删除进程PID与 <em>pid</em> 相等的进程的处理函数。</p>
<p>处理函数成功删除时返回 <code class="docutils literal notranslate"><span class="pre">True</span></code> ,没有删除时返回 <code class="docutils literal notranslate"><span class="pre">False</span></code></p>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractChildWatcher.attach_loop">
<code class="sig-name descname">attach_loop</code><span class="sig-paren">(</span><em class="sig-param">loop</em><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractChildWatcher.attach_loop" title="永久链接至目标"></a></dt>
<dd><p>给一个事件循环绑定监视器。</p>
<p>如果监视器之前已绑定另一个事件循环,那么在绑定新循环前会先解绑原来的事件循环。</p>
<p>注意:循环有可能是 <code class="docutils literal notranslate"><span class="pre">None</span></code></p>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractChildWatcher.is_active">
<code class="sig-name descname">is_active</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractChildWatcher.is_active" title="永久链接至目标"></a></dt>
<dd><p>如果监视器已准备好使用则返回 <code class="docutils literal notranslate"><span class="pre">True</span></code></p>
<p>使用 <em>不活动的</em> 当前子监视器生成子进程将引发 <a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a></p>
<div class="versionadded">
<p><span class="versionmodified added">3.8 新版功能.</span></p>
</div>
</dd></dl>
<dl class="method">
<dt id="asyncio.AbstractChildWatcher.close">
<code class="sig-name descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asyncio.AbstractChildWatcher.close" title="永久链接至目标"></a></dt>
<dd><p>关闭监视器。</p>
<p>必须调用这个方法以确保相关资源会被清理。</p>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="asyncio.ThreadedChildWatcher">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">ThreadedChildWatcher</code><a class="headerlink" href="#asyncio.ThreadedChildWatcher" title="永久链接至目标"></a></dt>
<dd><p>此实现会为每个生成的子进程启动一具新的等待线程。</p>
<p>即使是当 asyncio 事件循环运行在非主 OS 线程上时它也能可靠地工作。</p>
<p>当处理大量子进程时不存在显著的开销 (每次子进程结束时为 <em>O(1)</em>),但当每个进程启动一个线程时则需要额外的内存。</p>
<p>此监视器会默认被使用。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.8 新版功能.</span></p>
</div>
</dd></dl>
<dl class="class">
<dt id="asyncio.MultiLoopChildWatcher">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">MultiLoopChildWatcher</code><a class="headerlink" href="#asyncio.MultiLoopChildWatcher" title="永久链接至目标"></a></dt>
<dd><p>此实现会在实例化时注册一个 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code> 信号处理程序。 这可能会破坏为 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code> 信号安装自定义处理程序的第三方代码。</p>
<p>此监视器会在收到 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code> 信号时通过显式地轮询每个进程来避免干扰其他代码生成的进程。</p>
<p>该监视器一旦被安装就不会限制从不同线程运行子进程。</p>
<p>该解决方案是安全的,但在处理大量进程时会有显著的开销 (每收到一个 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code> 时为 <em>O(n)</em>)。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.8 新版功能.</span></p>
</div>
</dd></dl>
<dl class="class">
<dt id="asyncio.SafeChildWatcher">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">SafeChildWatcher</code><a class="headerlink" href="#asyncio.SafeChildWatcher" title="永久链接至目标"></a></dt>
<dd><p>该实现会使用主线程中的活动事件循环来处理 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code> 信号。 如果主线程没有正在运行的事件循环,则其他线程无法生成子进程 (会引发 <a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a>)。</p>
<p>此监视器会在收到 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code> 信号时通过显式地轮询每个进程来避免干扰其他代码生成的进程。</p>
<p>该解决方案与 <a class="reference internal" href="#asyncio.MultiLoopChildWatcher" title="asyncio.MultiLoopChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">MultiLoopChildWatcher</span></code></a> 同样安全并同样具有 <em>O(N)</em> 复杂度,但需要主线程有正在运行的事件循环才能工作。</p>
</dd></dl>
<dl class="class">
<dt id="asyncio.FastChildWatcher">
<em class="property">class </em><code class="sig-prename descclassname">asyncio.</code><code class="sig-name descname">FastChildWatcher</code><a class="headerlink" href="#asyncio.FastChildWatcher" title="永久链接至目标"></a></dt>
<dd><p>这种实现直接调用 <code class="docutils literal notranslate"><span class="pre">os.waitpid(-1)</span></code> 来获取所有已结束的进程,可能会中断其它代码洐生进程并等待它们结束。</p>
<p>在处理大量子监视器时没有明显的开销( <em>O(1)</em> 每次子监视器结束)。</p>
<p>该解决方案需要主线程有正在运行的事件循环才能工作,这与 <a class="reference internal" href="#asyncio.SafeChildWatcher" title="asyncio.SafeChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">SafeChildWatcher</span></code></a> 一样。</p>
</dd></dl>
</section>
<section id="custom-policies">
<h2>自定义策略<a class="headerlink" href="#custom-policies" title="永久链接至标题"></a></h2>
<p>要实现一个新的事件循环策略,建议子类化 <a class="reference internal" href="#asyncio.DefaultEventLoopPolicy" title="asyncio.DefaultEventLoopPolicy"><code class="xref py py-class docutils literal notranslate"><span class="pre">DefaultEventLoopPolicy</span></code></a> 并重写需要定制行为的方法,例如:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyEventLoopPolicy</span><span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">DefaultEventLoopPolicy</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_event_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the event loop.</span>
<span class="sd"> This may be None or an instance of EventLoop.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">loop</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span>
<span class="c1"># Do something with loop ...</span>
<span class="k">return</span> <span class="n">loop</span>
<span class="n">asyncio</span><span class="o">.</span><span class="n">set_event_loop_policy</span><span class="p">(</span><span class="n">MyEventLoopPolicy</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="#">策略</a><ul>
<li><a class="reference internal" href="#getting-and-setting-the-policy">获取和设置策略</a></li>
<li><a class="reference internal" href="#policy-objects">策略对象</a></li>
<li><a class="reference internal" href="#process-watchers">进程监视器</a></li>
<li><a class="reference internal" href="#custom-policies">自定义策略</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="asyncio-protocol.html"
title="上一章">传输和协议</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="asyncio-platforms.html"
title="下一章">平台支持</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/asyncio-policy.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="asyncio-platforms.html" title="平台支持"
>下一页</a> |</li>
<li class="right" >
<a href="asyncio-protocol.html" title="传输和协议"
>上一页</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="nav-item nav-item-3"><a href="asyncio.html" ><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code> --- 异步 I/O</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>