2019-04-21 11:50:48 +08:00

20 lines
13 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.

<div class="body" role="main"><div class="section" id="module-sched"><h1><span class="yiyi-st" id="yiyi-10">17.6. <a class="reference internal" href="#module-sched" title="sched: General purpose event scheduler."><code class="xref py py-mod docutils literal"><span class="pre">sched</span></code></a> - 事件调度程序</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/sched.py">Lib / sched.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-sched" title="sched: General purpose event scheduler."><code class="xref py py-mod docutils literal"><span class="pre">sched</span></code></a>模块定义了实现通用事件调度器的类:</span></p><dl class="class"><dt id="sched.scheduler"><span class="yiyi-st" id="yiyi-13"> <em class="property">class </em><code class="descclassname">sched.</code><code class="descname">scheduler</code><span class="sig-paren">(</span><em>timefunc=time.monotonic</em>, <em>delayfunc=time.sleep</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-14"><a class="reference internal" href="#sched.scheduler" title="sched.scheduler"><code class="xref py py-class docutils literal"><span class="pre">scheduler</span></code></a>类定义了调度事件的通用接口。</span><span class="yiyi-st" id="yiyi-15">它需要两个函数实际地处理“外部世界” - <em>timefunc</em>是无参数调用,并返回一个数字(“时间”,无论任何单位)。</span><span class="yiyi-st" id="yiyi-16">如果time.monotonic不可用<em>timefunc</em>默认值为time.time。</span><span class="yiyi-st" id="yiyi-17"><em>delayfunc</em>函数是带一个参数的调用,与<em>timefunc</em>的输出兼容,并应延迟许多时间单位。</span><span class="yiyi-st" id="yiyi-18">在每个事件运行后,还将使用参数<code class="docutils literal"><span class="pre">0</span></code>调用<em>delayfunc</em>,以允许其他线程有机会在多线程应用程序中运行。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-19"><span class="versionmodified">在版本3.3中更改:</span> <em>timefunc</em><em>delayfunc</em>参数是可选的。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-20"><span class="versionmodified">在版本3.3中更改:</span> <a class="reference internal" href="#sched.scheduler" title="sched.scheduler"><code class="xref py py-class docutils literal"><span class="pre">scheduler</span></code></a>类可以安全地在多线程环境中使用。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-21">例:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">sched</span><span class="o">,</span> <span class="nn">time</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="n">sched</span><span class="o">.</span><span class="n">scheduler</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">print_time</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="s1">'default'</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"From print_time"</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">(),</span> <span class="n">a</span><span class="p">)</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">print_some_times</span><span class="p">():</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="gp">... </span> <span class="n">s</span><span class="o">.</span><span class="n">enter</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">print_time</span><span class="p">)</span>
<span class="gp">... </span> <span class="n">s</span><span class="o">.</span><span class="n">enter</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">print_time</span><span class="p">,</span> <span class="n">argument</span><span class="o">=</span><span class="p">(</span><span class="s1">'positional'</span><span class="p">,))</span>
<span class="gp">... </span> <span class="n">s</span><span class="o">.</span><span class="n">enter</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">print_time</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s1">'a'</span><span class="p">:</span> <span class="s1">'keyword'</span><span class="p">})</span>
<span class="gp">... </span> <span class="n">s</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">print_some_times</span><span class="p">()</span>
<span class="go">930343690.257</span>
<span class="go">From print_time 930343695.274 positional</span>
<span class="go">From print_time 930343695.275 keyword</span>
<span class="go">From print_time 930343700.273 default</span>
<span class="go">930343700.276</span>
</code></pre><div class="section" id="scheduler-objects"><h2><span class="yiyi-st" id="yiyi-22">17.6.1. </span><span class="yiyi-st" id="yiyi-23">Scheduler Objects</span></h2><p><span class="yiyi-st" id="yiyi-24"><a class="reference internal" href="#sched.scheduler" title="sched.scheduler"><code class="xref py py-class docutils literal"><span class="pre">scheduler</span></code></a>实例具有以下方法和属性:</span></p><dl class="method"><dt id="sched.scheduler.enterabs"><span class="yiyi-st" id="yiyi-25"> <code class="descclassname">scheduler.</code><code class="descname">enterabs</code><span class="sig-paren">(</span><em>time</em>, <em>priority</em>, <em>action</em>, <em>argument=()</em>, <em>kwargs={}</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-26">安排新活动。</span><span class="yiyi-st" id="yiyi-27"><em>时间</em>参数应为与传递给构造函数的<em>timefunc</em>函数的返回值兼容的数字类型。</span><span class="yiyi-st" id="yiyi-28">为相同<em>时间</em>安排的活动将按照<em>优先级</em>的顺序执行。</span></p><p><span class="yiyi-st" id="yiyi-29">执行事件意味着执行<code class="docutils literal"><span class="pre">action* argument</span> <span class="pre">** kwargs</span></code></span><span class="yiyi-st" id="yiyi-30"><em>参数</em>是包含<em>动作</em>的位置参数的序列。</span><span class="yiyi-st" id="yiyi-31"><em>kwargs</em>是一个包含<em>动作</em>的关键字参数的字典。</span></p><p><span class="yiyi-st" id="yiyi-32">返回值是可用于稍后取消事件的事件(请参见<a class="reference internal" href="#sched.scheduler.cancel" title="sched.scheduler.cancel"><code class="xref py py-meth docutils literal"><span class="pre">cancel()</span></code></a>)。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-33"><span class="versionmodified">在版本3.3中更改:</span> <em>参数</em>参数是可选的。</span></p></div><div class="versionadded"><p><span class="yiyi-st" id="yiyi-34"><span class="versionmodified">版本3.3中新增:</span> <em>kwargs</em>参数已添加。</span></p></div></dd></dl><dl class="method"><dt id="sched.scheduler.enter"><span class="yiyi-st" id="yiyi-35"> <code class="descclassname">scheduler.</code><code class="descname">enter</code><span class="sig-paren">(</span><em>delay</em>, <em>priority</em>, <em>action</em>, <em>argument=()</em>, <em>kwargs={}</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-36">安排<em>延迟</em>更多时间单位的事件。</span><span class="yiyi-st" id="yiyi-37">除了相对时间,其他参数,效果和返回值与<a class="reference internal" href="#sched.scheduler.enterabs" title="sched.scheduler.enterabs"><code class="xref py py-meth docutils literal"><span class="pre">enterabs()</span></code></a>的相同。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-38"><span class="versionmodified">在版本3.3中更改:</span> <em>参数</em>参数是可选的。</span></p></div><div class="versionadded"><p><span class="yiyi-st" id="yiyi-39"><span class="versionmodified">版本3.3中新增:</span> <em>kwargs</em>参数已添加。</span></p></div></dd></dl><dl class="method"><dt id="sched.scheduler.cancel"><span class="yiyi-st" id="yiyi-40"> <code class="descclassname">scheduler.</code><code class="descname">cancel</code><span class="sig-paren">(</span><em>event</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-41">从队列中删除事件。</span><span class="yiyi-st" id="yiyi-42">如果<em>事件</em>不是队列中当前的事件,则此方法将引发<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a></span></p></dd></dl><dl class="method"><dt id="sched.scheduler.empty"><span class="yiyi-st" id="yiyi-43"> <code class="descclassname">scheduler.</code><code class="descname">empty</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">如果事件队列为空则返回true。</span></p></dd></dl><dl class="method"><dt id="sched.scheduler.run"><span class="yiyi-st" id="yiyi-45"> <code class="descclassname">scheduler.</code><code class="descname">run</code><span class="sig-paren">(</span><em>blocking=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-46">运行所有计划的事件。</span><span class="yiyi-st" id="yiyi-47">这个方法将等待(使用传递给构造函数的<code class="xref py py-func docutils literal"><span class="pre">delayfunc()</span></code>函数)下一个事件,然后执行它,直到没有更多的调度事件。</span></p><p><span class="yiyi-st" id="yiyi-48">如果<em>阻塞</em>为false则执行预定事件由于到期最快如果有然后返回调度程序中下一个调度的调用的最后期限如果有</span></p><p><span class="yiyi-st" id="yiyi-49"><em>动作</em><em>delayfunc</em>可引发异常。</span><span class="yiyi-st" id="yiyi-50">在任一情况下,调度程序将保持一致的状态并传播异常。</span><span class="yiyi-st" id="yiyi-51">如果<em>action</em>引发异常,则在未来调用<a class="reference internal" href="#sched.scheduler.run" title="sched.scheduler.run"><code class="xref py py-meth docutils literal"><span class="pre">run()</span></code></a>时不会尝试该事件。</span></p><p><span class="yiyi-st" id="yiyi-52">如果事件序列比下一个事件之前可用的时间运行时间更长,则调度器将会落后。</span><span class="yiyi-st" id="yiyi-53">没有事件将被丢弃;调用代码负责取消不再相关的事件。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-54"><span class="versionmodified">版本3.3中的新功能:</span>添加了<em>阻止</em>参数。</span></p></div></dd></dl><dl class="attribute"><dt id="sched.scheduler.queue"><span class="yiyi-st" id="yiyi-55"> <code class="descclassname">scheduler.</code><code class="descname">queue</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">只读属性以它们将要运行的顺序返回即将到来的事件的列表。</span><span class="yiyi-st" id="yiyi-57">每个事件都显示为<a class="reference internal" href="../glossary.html#term-named-tuple"><span class="xref std std-term">named tuple</span></a>其中包含以下字段timepriorityactionargumentkwargs。</span></p></dd></dl></div></div></div>