mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 06:55:36 +08:00
20 lines
13 KiB
HTML
20 lines
13 KiB
HTML
<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">>>> </span><span class="kn">import</span> <span class="nn">sched</span><span class="o">,</span> <span class="nn">time</span>
|
||
<span class="gp">>>> </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">>>> </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">>>> </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">>>> </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>,其中包含以下字段:time,priority,action,argument,kwargs。</span></p></dd></dl></div></div></div> |