source: sasview/_modules/sas/data_util/calcthread.html @ a462c6a

gh-pages
Last change on this file since a462c6a was a462c6a, checked in by ajj, 9 years ago

Rebuild to fix index and modules docs

  • Property mode set to 100644
File size: 41.7 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html xmlns="http://www.w3.org/1999/xhtml">
6  <head>
7    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8   
9    <title>sas.data_util.calcthread &mdash; SasView 3.0.0 documentation</title>
10   
11    <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
12    <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
13   
14    <script type="text/javascript">
15      var DOCUMENTATION_OPTIONS = {
16        URL_ROOT:    '../../../',
17        VERSION:     '3.0.0',
18        COLLAPSE_INDEX: false,
19        FILE_SUFFIX: '.html',
20        HAS_SOURCE:  true
21      };
22    </script>
23    <script type="text/javascript" src="../../../_static/jquery.js"></script>
24    <script type="text/javascript" src="../../../_static/underscore.js"></script>
25    <script type="text/javascript" src="../../../_static/doctools.js"></script>
26    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
27    <link rel="top" title="SasView 3.0.0 documentation" href="../../../index.html" />
28    <link rel="up" title="Module code" href="../../index.html" /> 
29  </head>
30  <body>
31    <div class="related">
32      <h3>Navigation</h3>
33      <ul>
34        <li class="right" style="margin-right: 10px">
35          <a href="../../../genindex.html" title="General Index"
36             accesskey="I">index</a></li>
37        <li class="right" >
38          <a href="../../../py-modindex.html" title="Python Module Index"
39             >modules</a> |</li>
40        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
41          <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li> 
42      </ul>
43    </div> 
44
45    <div class="document">
46      <div class="documentwrapper">
47        <div class="bodywrapper">
48          <div class="body">
49           
50  <h1>Source code for sas.data_util.calcthread</h1><div class="highlight"><pre>
51<span class="c"># This program is public domain</span>
52
53<span class="c">## \file</span>
54<span class="c">#  \brief Abstract class for defining calculation threads.</span>
55<span class="c">#</span>
56
57<span class="kn">import</span> <span class="nn">thread</span>
58<span class="kn">import</span> <span class="nn">traceback</span>
59<span class="kn">import</span> <span class="nn">sys</span>
60
61<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s">&quot;darwin&quot;</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
62    <span class="kn">import</span> <span class="nn">time</span>
63    <span class="n">stime</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
64   
65<div class="viewcode-block" id="clock"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.clock">[docs]</a>    <span class="k">def</span> <span class="nf">clock</span><span class="p">():</span>
66        <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">stime</span>
67    </div>
68<div class="viewcode-block" id="sleep"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.sleep">[docs]</a>    <span class="k">def</span> <span class="nf">sleep</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
69        <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">t</span><span class="p">)</span></div>
70<span class="k">else</span><span class="p">:</span>
71    <span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">clock</span>
72    <span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
73
74
75<div class="viewcode-block" id="CalcThread"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread">[docs]</a><span class="k">class</span> <span class="nc">CalcThread</span><span class="p">:</span>
76    <span class="sd">&quot;&quot;&quot;Threaded calculation class.  Inherit from here and specialize</span>
77<span class="sd">    the compute() method to perform the appropriate operations for the</span>
78<span class="sd">    class.</span>
79
80<span class="sd">    If you specialize the __init__ method be sure to call</span>
81<span class="sd">    CalcThread.__init__, passing it the keyword arguments for</span>
82<span class="sd">    yieldtime, worktime, update and complete.</span>
83<span class="sd">    </span>
84<span class="sd">    When defining the compute() method you need to include code which</span>
85<span class="sd">    allows the GUI to run.  They are as follows: ::</span>
86
87<span class="sd">        self.isquit()          # call frequently to check for interrupts</span>
88<span class="sd">        self.update(kw=...)    # call when the GUI could be updated</span>
89<span class="sd">        self.complete(kw=...)  # call before exiting compute()</span>
90
91<span class="sd">    The update() and complete() calls accept field=value keyword</span>
92<span class="sd">    arguments which are passed to the called function.  complete()</span>
93<span class="sd">    should be called before exiting the GUI function.  A KeyboardInterrupt</span>
94<span class="sd">    event is triggered if the GUI signals that the computation should</span>
95<span class="sd">    be halted.</span>
96
97<span class="sd">    The following documentation should be included in the description</span>
98<span class="sd">    of the derived class.</span>
99
100<span class="sd">    The user of this class will call the following: ::</span>
101
102<span class="sd">        thread = Work(...,kw=...)  # prepare the work thread.</span>
103<span class="sd">        thread.queue(...,kw=...)   # queue a work unit</span>
104<span class="sd">        thread.requeue(...,kw=...) # replace work unit on the end of queue</span>
105<span class="sd">        thread.reset(...,kw=...)   # reset the queue to the given work unit</span>
106<span class="sd">        thread.stop()              # clear the queue and halt</span>
107<span class="sd">        thread.interrupt()         # halt the current work unit but continue</span>
108<span class="sd">        thread.ready(delay=0.)     # request an update signal after delay</span>
109<span class="sd">        thread.isrunning()         # returns true if compute() is running</span>
110
111<span class="sd">    Use queue() when all work must be done.  Use requeue() when intermediate</span>
112<span class="sd">    work items don&#39;t need to be done (e.g., in response to a mouse move</span>
113<span class="sd">    event).  Use reset() when the current item doesn&#39;t need to be completed</span>
114<span class="sd">    before the new event (e.g., in response to a mouse release event).  Use</span>
115<span class="sd">    stop() to halt the current and pending computations (e.g., in response to</span>
116<span class="sd">    a stop button).</span>
117
118<span class="sd">    The methods queue(), requeue() and reset() are proxies for the compute()</span>
119<span class="sd">    method in the subclass.  Look there for a description of the arguments.</span>
120<span class="sd">    The compute() method can be called directly to run the computation in</span>
121<span class="sd">    the main thread, but it should not be called if isrunning() returns true.</span>
122
123<span class="sd">    The constructor accepts additional keywords yieldtime=0.01 and</span>
124<span class="sd">    worktime=0.01 which determine the cooperative multitasking</span>
125<span class="sd">    behaviour.  Yield time is the duration of the sleep period</span>
126<span class="sd">    required to give other processes a chance to run.  Work time</span>
127<span class="sd">    is the duration between sleep periods.</span>
128
129<span class="sd">    Notifying the GUI thread of work in progress and work complete</span>
130<span class="sd">    is done with updatefn=updatefn and completefn=completefn arguments</span>
131<span class="sd">    to the constructor.  Details of the parameters to the functions</span>
132<span class="sd">    depend on the particular calculation class, but they will all</span>
133<span class="sd">    be passed as keyword arguments.  Details of how the functions</span>
134<span class="sd">    should be implemented vary from framework to framework.</span>
135
136<span class="sd">    For wx, something like the following is needed: ::</span>
137
138<span class="sd">        import wx, wx.lib.newevent</span>
139<span class="sd">        (CalcCompleteEvent, EVT_CALC_COMPLETE) = wx.lib.newevent.NewEvent()</span>
140
141<span class="sd">        # methods in the main window class of your application</span>
142<span class="sd">        def __init__():</span>
143<span class="sd">            ...</span>
144<span class="sd">            # Prepare the calculation in the GUI thread.</span>
145<span class="sd">            self.work = Work(completefn=self.CalcComplete)</span>
146<span class="sd">            self.Bind(EVT_CALC_COMPLETE, self.OnCalcComplete)</span>
147<span class="sd">            ...</span>
148<span class="sd">            # Bind work queue to a menu event.</span>
149<span class="sd">            self.Bind(wx.EVT_MENU, self.OnCalcStart, id=idCALCSTART)</span>
150<span class="sd">            ...</span>
151
152<span class="sd">        def OnCalcStart(self,event):</span>
153<span class="sd">            # Start the work thread from the GUI thread.</span>
154<span class="sd">            self.work.queue(...work unit parameters...)</span>
155
156<span class="sd">        def CalcComplete(self,**kwargs):</span>
157<span class="sd">            # Generate CalcComplete event in the calculation thread.</span>
158<span class="sd">            # kwargs contains field1, field2, etc. as defined by</span>
159<span class="sd">            # the Work thread class.</span>
160<span class="sd">            event = CalcCompleteEvent(**kwargs)</span>
161<span class="sd">            wx.PostEvent(self, event)</span>
162
163<span class="sd">        def OnCalcComplete(self,event):</span>
164<span class="sd">            # Process CalcComplete event in GUI thread.</span>
165<span class="sd">            # Use values from event.field1, event.field2 etc. as</span>
166<span class="sd">            # defined by the Work thread class to show the results.</span>
167<span class="sd">            ...</span>
168<span class="sd">    &quot;&quot;&quot;</span>
169
170    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">completefn</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">updatefn</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
171                 <span class="n">yieldtime</span><span class="o">=</span><span class="mf">0.01</span><span class="p">,</span> <span class="n">worktime</span><span class="o">=</span><span class="mf">0.01</span><span class="p">):</span>
172        <span class="sd">&quot;&quot;&quot;Prepare the calculator&quot;&quot;&quot;</span>
173        <span class="bp">self</span><span class="o">.</span><span class="n">yieldtime</span>     <span class="o">=</span> <span class="n">yieldtime</span>
174        <span class="bp">self</span><span class="o">.</span><span class="n">worktime</span>      <span class="o">=</span> <span class="n">worktime</span>
175        <span class="bp">self</span><span class="o">.</span><span class="n">completefn</span>    <span class="o">=</span> <span class="n">completefn</span>
176        <span class="bp">self</span><span class="o">.</span><span class="n">updatefn</span>      <span class="o">=</span> <span class="n">updatefn</span>
177        <span class="bp">self</span><span class="o">.</span><span class="n">_interrupting</span> <span class="o">=</span> <span class="bp">False</span>
178        <span class="bp">self</span><span class="o">.</span><span class="n">_running</span>      <span class="o">=</span> <span class="bp">False</span>
179        <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span>        <span class="o">=</span> <span class="p">[]</span>
180        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span>         <span class="o">=</span> <span class="n">thread</span><span class="o">.</span><span class="n">allocate_lock</span><span class="p">()</span>
181        <span class="bp">self</span><span class="o">.</span><span class="n">_delay</span>        <span class="o">=</span> <span class="mf">1e6</span>
182
183<div class="viewcode-block" id="CalcThread.queue"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.queue">[docs]</a>    <span class="k">def</span> <span class="nf">queue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
184        <span class="sd">&quot;&quot;&quot;Add a work unit to the end of the queue.  See the compute()</span>
185<span class="sd">        method for details of the arguments to the work unit.&quot;&quot;&quot;</span>
186        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
187        <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
188        <span class="c"># Cannot do start_new_thread call within the lock</span>
189        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
190        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="p">:</span>
191            <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_update</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span> <span class="o">+</span> <span class="mf">1e6</span>
192            <span class="n">thread</span><span class="o">.</span><span class="n">start_new_thread</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_run</span><span class="p">,</span> <span class="p">())</span>
193</div>
194<div class="viewcode-block" id="CalcThread.requeue"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.requeue">[docs]</a>    <span class="k">def</span> <span class="nf">requeue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
195        <span class="sd">&quot;&quot;&quot;Replace the work unit on the end of the queue.  See the compute()</span>
196<span class="sd">        method for details of the arguments to the work unit.&quot;&quot;&quot;</span>
197        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
198        <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
199        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
200        <span class="bp">self</span><span class="o">.</span><span class="n">queue</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
201</div>
202<div class="viewcode-block" id="CalcThread.reset"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.reset">[docs]</a>    <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
203        <span class="sd">&quot;&quot;&quot;Clear the queue and start a new work unit.  See the compute()</span>
204<span class="sd">        method for details of the arguments to the work unit.&quot;&quot;&quot;</span>
205        <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
206        <span class="bp">self</span><span class="o">.</span><span class="n">queue</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
207</div>
208<div class="viewcode-block" id="CalcThread.stop"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.stop">[docs]</a>    <span class="k">def</span> <span class="nf">stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
209        <span class="sd">&quot;&quot;&quot;Clear the queue and stop the thread.  New items may be</span>
210<span class="sd">        queued after stop.  To stop just the current work item, and</span>
211<span class="sd">        continue the rest of the queue call the interrupt method&quot;&quot;&quot;</span>
212        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
213        <span class="bp">self</span><span class="o">.</span><span class="n">_interrupting</span> <span class="o">=</span> <span class="bp">True</span>
214        <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span> <span class="o">=</span> <span class="p">[]</span>
215        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
216</div>
217<div class="viewcode-block" id="CalcThread.interrupt"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.interrupt">[docs]</a>    <span class="k">def</span> <span class="nf">interrupt</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
218        <span class="sd">&quot;&quot;&quot;Stop the current work item.  To clear the work queue as</span>
219<span class="sd">        well call the stop() method.&quot;&quot;&quot;</span>
220        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
221        <span class="bp">self</span><span class="o">.</span><span class="n">_interrupting</span> <span class="o">=</span> <span class="bp">True</span>
222        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
223</div>
224<div class="viewcode-block" id="CalcThread.isrunning"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.isrunning">[docs]</a>    <span class="k">def</span> <span class="nf">isrunning</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
225        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span>
226</div>
227<div class="viewcode-block" id="CalcThread.ready"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.ready">[docs]</a>    <span class="k">def</span> <span class="nf">ready</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">delay</span><span class="o">=</span><span class="mf">0.</span><span class="p">):</span>
228        <span class="sd">&quot;&quot;&quot;Ready for another update after delay=t seconds.  Call</span>
229<span class="sd">        this for threads which can show intermediate results from</span>
230<span class="sd">        long calculations.&quot;&quot;&quot;</span>
231        <span class="bp">self</span><span class="o">.</span><span class="n">_delay</span> <span class="o">=</span> <span class="n">delay</span>
232        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
233        <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_update</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span> <span class="o">+</span> <span class="n">delay</span>
234        <span class="c"># print &quot;setting _time_for_update to &quot;,self._time_for_update</span>
235        <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
236</div>
237<div class="viewcode-block" id="CalcThread.isquit"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.isquit">[docs]</a>    <span class="k">def</span> <span class="nf">isquit</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
238        <span class="sd">&quot;&quot;&quot;Check for interrupts.  Should be called frequently to</span>
239<span class="sd">        provide user responsiveness.  Also yields to other running</span>
240<span class="sd">        threads, which is required for good performance on OS X.&quot;&quot;&quot;</span>
241
242        <span class="c"># Only called from within the running thread so no need to lock</span>
243        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">yieldtime</span> <span class="o">&gt;</span> <span class="mi">0</span> \
244            <span class="ow">and</span> <span class="n">clock</span><span class="p">()</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_nap</span><span class="p">:</span>
245            <span class="n">sleep</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">yieldtime</span><span class="p">)</span>
246            <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_nap</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktime</span>
247        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_interrupting</span><span class="p">:</span>
248            <span class="k">raise</span> <span class="ne">KeyboardInterrupt</span>
249</div>
250<div class="viewcode-block" id="CalcThread.update"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.update">[docs]</a>    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
251
252        <span class="sd">&quot;&quot;&quot;Update GUI with the lastest results from the current work unit.&quot;&quot;&quot;</span>
253        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">updatefn</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">clock</span><span class="p">()</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_update</span><span class="p">:</span>
254            <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
255            <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_update</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delay</span>
256            <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
257            <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_update</span> <span class="o">+=</span> <span class="mf">1e6</span>  <span class="c"># No more updates</span>
258           
259            <span class="bp">self</span><span class="o">.</span><span class="n">updatefn</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
260            <span class="n">sleep</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">yieldtime</span><span class="p">)</span>
261            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_interrupting</span><span class="p">:</span>
262                <span class="k">raise</span> <span class="ne">KeyboardInterrupt</span>
263        <span class="k">else</span><span class="p">:</span>
264            <span class="bp">self</span><span class="o">.</span><span class="n">isquit</span><span class="p">()</span>
265        <span class="k">return</span>
266</div>
267<div class="viewcode-block" id="CalcThread.complete"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.complete">[docs]</a>    <span class="k">def</span> <span class="nf">complete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
268        <span class="sd">&quot;&quot;&quot;Update the GUI with the completed results from a work unit.&quot;&quot;&quot;</span>
269        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">completefn</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
270            <span class="bp">self</span><span class="o">.</span><span class="n">completefn</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
271            <span class="n">sleep</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">yieldtime</span><span class="p">)</span>
272        <span class="k">return</span>
273</div>
274<div class="viewcode-block" id="CalcThread.compute"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcThread.compute">[docs]</a>    <span class="k">def</span> <span class="nf">compute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
275        <span class="sd">&quot;&quot;&quot;Perform a work unit.  The subclass will provide details of</span>
276<span class="sd">        the arguments.&quot;&quot;&quot;</span>
277        <span class="k">raise</span> <span class="bp">NotImplemented</span><span class="p">,</span> <span class="s">&quot;Calculation thread needs compute method&quot;</span>
278</div>
279    <span class="k">def</span> <span class="nf">_run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
280        <span class="sd">&quot;&quot;&quot;Internal function to manage the thread.&quot;&quot;&quot;</span>
281        <span class="c"># The code for condition wait in the threading package is</span>
282        <span class="c"># implemented using polling.  I&#39;ll accept for now that the</span>
283        <span class="c"># authors of this code are clever enough that polling is</span>
284        <span class="c"># difficult to avoid.  Rather than polling, I will exit the</span>
285        <span class="c"># thread when the queue is empty and start a new thread when</span>
286        <span class="c"># there is more work to be done.</span>
287        <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
288            <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
289            <span class="bp">self</span><span class="o">.</span><span class="n">_time_for_nap</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktime</span>
290            <span class="bp">self</span><span class="o">.</span><span class="n">_running</span> <span class="o">=</span> <span class="bp">True</span>
291            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span> <span class="o">==</span> <span class="p">[]:</span>
292                <span class="k">break</span>
293            <span class="bp">self</span><span class="o">.</span><span class="n">_interrupting</span> <span class="o">=</span> <span class="bp">False</span>
294            <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
295            <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
296            <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
297            <span class="k">try</span><span class="p">:</span>
298                <span class="bp">self</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
299            <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
300                <span class="k">pass</span>
301            <span class="k">except</span><span class="p">:</span>
302                <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
303                <span class="c">#print &#39;CalcThread exception&#39;,</span>
304        <span class="bp">self</span><span class="o">.</span><span class="n">_running</span> <span class="o">=</span> <span class="bp">False</span>
305
306
307<span class="c"># ======================================================================</span>
308<span class="c"># Demonstration of calcthread in action</span></div>
309<div class="viewcode-block" id="CalcDemo"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcDemo">[docs]</a><span class="k">class</span> <span class="nc">CalcDemo</span><span class="p">(</span><span class="n">CalcThread</span><span class="p">):</span>
310    <span class="sd">&quot;&quot;&quot;Example of a calculation thread.&quot;&quot;&quot;</span>
311<div class="viewcode-block" id="CalcDemo.compute"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcDemo.compute">[docs]</a>    <span class="k">def</span> <span class="nf">compute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
312        <span class="n">total</span> <span class="o">=</span> <span class="mf">0.</span>
313        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
314            <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="n">i</span><span class="p">)</span>
315            <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
316                <span class="bp">self</span><span class="o">.</span><span class="n">isquit</span><span class="p">()</span>
317                <span class="n">total</span> <span class="o">+=</span> <span class="n">j</span>
318        <span class="bp">self</span><span class="o">.</span><span class="n">complete</span><span class="p">(</span><span class="n">total</span><span class="o">=</span><span class="n">total</span><span class="p">)</span>
319
320</div></div>
321<div class="viewcode-block" id="CalcCommandline"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcCommandline">[docs]</a><span class="k">class</span> <span class="nc">CalcCommandline</span><span class="p">:</span>
322    <span class="sd">&quot;&quot;&quot;</span>
323<span class="sd">        Test method</span>
324<span class="sd">    &quot;&quot;&quot;</span>
325    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">20000</span><span class="p">):</span>
326        <span class="k">print</span> <span class="n">thread</span><span class="o">.</span><span class="n">get_ident</span><span class="p">()</span>
327        <span class="bp">self</span><span class="o">.</span><span class="n">starttime</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span>
328        <span class="bp">self</span><span class="o">.</span><span class="n">done</span> <span class="o">=</span> <span class="bp">False</span>
329        <span class="bp">self</span><span class="o">.</span><span class="n">work</span> <span class="o">=</span> <span class="n">CalcDemo</span><span class="p">(</span><span class="n">completefn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">complete</span><span class="p">,</span>
330                             <span class="n">updatefn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">,</span> <span class="n">yieldtime</span><span class="o">=</span><span class="mf">0.001</span><span class="p">)</span>
331        <span class="bp">self</span><span class="o">.</span><span class="n">work2</span> <span class="o">=</span> <span class="n">CalcDemo</span><span class="p">(</span><span class="n">completefn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">complete</span><span class="p">,</span>
332                             <span class="n">updatefn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">)</span>
333        <span class="bp">self</span><span class="o">.</span><span class="n">work3</span> <span class="o">=</span> <span class="n">CalcDemo</span><span class="p">(</span><span class="n">completefn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">complete</span><span class="p">,</span>
334                             <span class="n">updatefn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">)</span>
335        <span class="bp">self</span><span class="o">.</span><span class="n">work</span><span class="o">.</span><span class="n">queue</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
336        <span class="bp">self</span><span class="o">.</span><span class="n">work2</span><span class="o">.</span><span class="n">queue</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
337        <span class="bp">self</span><span class="o">.</span><span class="n">work3</span><span class="o">.</span><span class="n">queue</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
338        <span class="k">print</span> <span class="s">&quot;Expect updates from Main every second and from thread every 2.5 seconds&quot;</span>
339        <span class="k">print</span> <span class="s">&quot;&quot;</span>
340        <span class="bp">self</span><span class="o">.</span><span class="n">work</span><span class="o">.</span><span class="n">ready</span><span class="p">(</span><span class="o">.</span><span class="mi">5</span><span class="p">)</span>
341        <span class="k">while</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">done</span><span class="p">:</span>
342            <span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
343            <span class="k">print</span> <span class="s">&quot;Main thread </span><span class="si">%d</span><span class="s"> at </span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">thread</span><span class="o">.</span><span class="n">get_ident</span><span class="p">(),</span>
344                                              <span class="n">clock</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">starttime</span><span class="p">)</span>
345
346<div class="viewcode-block" id="CalcCommandline.update"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcCommandline.update">[docs]</a>    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
347        <span class="k">print</span> <span class="s">&quot;Update i=</span><span class="si">%d</span><span class="s"> from thread </span><span class="si">%d</span><span class="s"> at </span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">thread</span><span class="o">.</span><span class="n">get_ident</span><span class="p">(),</span>
348                                                      <span class="n">clock</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">starttime</span><span class="p">)</span>
349        <span class="bp">self</span><span class="o">.</span><span class="n">work</span><span class="o">.</span><span class="n">ready</span><span class="p">(</span><span class="mf">2.5</span><span class="p">)</span>
350</div>
351<div class="viewcode-block" id="CalcCommandline.complete"><a class="viewcode-back" href="../../../dev/api/sas.data_util.html#sas.data_util.calcthread.CalcCommandline.complete">[docs]</a>    <span class="k">def</span> <span class="nf">complete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">total</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
352        <span class="k">print</span> <span class="s">&quot;Complete total=</span><span class="si">%g</span><span class="s"> from thread </span><span class="si">%d</span><span class="s"> at </span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">total</span><span class="p">,</span>
353                                                    <span class="n">thread</span><span class="o">.</span><span class="n">get_ident</span><span class="p">(),</span>
354                                                    <span class="n">clock</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">starttime</span><span class="p">)</span>
355        <span class="bp">self</span><span class="o">.</span><span class="n">done</span> <span class="o">=</span> <span class="bp">True</span></div></div>
356</pre></div>
357
358          </div>
359        </div>
360      </div>
361      <div class="sphinxsidebar">
362        <div class="sphinxsidebarwrapper">
363<div id="searchbox" style="display: none">
364  <h3>Quick search</h3>
365    <form class="search" action="../../../search.html" method="get">
366      <input type="text" name="q" />
367      <input type="submit" value="Go" />
368      <input type="hidden" name="check_keywords" value="yes" />
369      <input type="hidden" name="area" value="default" />
370    </form>
371    <p class="searchtip" style="font-size: 90%">
372    Enter search terms or a module, class or function name.
373    </p>
374</div>
375<script type="text/javascript">$('#searchbox').show(0);</script>
376        </div>
377      </div>
378      <div class="clearer"></div>
379    </div>
380    <div class="related">
381      <h3>Navigation</h3>
382      <ul>
383        <li class="right" style="margin-right: 10px">
384          <a href="../../../genindex.html" title="General Index"
385             >index</a></li>
386        <li class="right" >
387          <a href="../../../py-modindex.html" title="Python Module Index"
388             >modules</a> |</li>
389        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
390          <li><a href="../../index.html" >Module code</a> &raquo;</li> 
391      </ul>
392    </div>
393    <div class="footer">
394        &copy; Copyright 2013, The SasView Project.
395      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
396    </div>
397  </body>
398</html>
Note: See TracBrowser for help on using the repository browser.