[code.view]

[top] / python / PyMOTW / docs / sys / threads.html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Low-level Thread Support &mdash; Python Module of the Week</title>
    <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '1.132',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="author" title="About these documents" href="../about.html" />
    <link rel="top" title="Python Module of the Week" href="../index.html" />
    <link rel="up" title="sys – System-specific Configuration" href="index.html" />
    <link rel="next" title="Modules and Imports" href="imports.html" />
    <link rel="prev" title="Tracing a Program As It Runs" href="tracing.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="imports.html" title="Modules and Imports"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="tracing.html" title="Tracing a Program As It Runs"
             accesskey="P">previous</a> |</li>
        <li><a href="../contents.html">PyMOTW</a> &raquo;</li>
          <li><a href="../runtime_services.html" >Python Runtime Services</a> &raquo;</li>
          <li><a href="index.html" accesskey="U">sys &#8211; System-specific Configuration</a> &raquo;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../contents.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">Low-level Thread Support</a><ul>
<li><a class="reference internal" href="#check-interval">Check Interval</a></li>
<li><a class="reference internal" href="#debugging">Debugging</a></li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="tracing.html"
                        title="previous chapter">Tracing a Program As It Runs</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="imports.html"
                        title="next chapter">Modules and Imports</a></p>
  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="../_sources/sys/threads.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" size="18" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="low-level-thread-support">
<span id="sys-threads"></span><h1>Low-level Thread Support<a class="headerlink" href="#low-level-thread-support" title="Permalink to this headline">¶</a></h1>
<p><a class="reference internal" href="index.html#module-sys" title="sys: System-specific configuration"><tt class="xref py py-mod docutils literal"><span class="pre">sys</span></tt></a> includes low-level functions for controlling and debugging
thread behavior.</p>
<div class="section" id="check-interval">
<h2>Check Interval<a class="headerlink" href="#check-interval" title="Permalink to this headline">¶</a></h2>
<p>Python 2 uses a form of cooperative multitasking in its thread
implementation.  At a fixed interval, bytecode execution is paused and
the interpreter checks if any signal handlers need to be executed.
During the same interval check, the global interpreter lock is also
released by the current thread and then reacquired, giving other
threads an opportunity to take over execution by grabbing the lock
first.</p>
<p>The default check interval is 100 bytecodes and the current value can
always be retrieved with <tt class="xref py py-func docutils literal"><span class="pre">sys.getcheckinterval()</span></tt>.  Changing the
interval with <tt class="xref py py-func docutils literal"><span class="pre">sys.setcheckinterval()</span></tt> may have an impact on the
performance of an application, depending on the nature of the
operations being performed.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">from</span> <span class="nn">Queue</span> <span class="kn">import</span> <span class="n">Queue</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="k">def</span> <span class="nf">show_thread</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="p">):</span>
    <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="mi">5</span><span class="p">):</span>
        <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">extraByteCodes</span><span class="p">):</span>
            <span class="k">pass</span>
        <span class="n">q</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">()</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
    <span class="k">return</span>

<span class="k">def</span> <span class="nf">run_threads</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="p">):</span>
    <span class="k">print</span> <span class="s">&#39;</span><span class="si">%(prefix)s</span><span class="s"> interval = </span><span class="si">%(interval)s</span><span class="s"> with </span><span class="si">%(extraByteCodes)s</span><span class="s"> extra operations&#39;</span> <span class="o">%</span> <span class="nb">locals</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">setcheckinterval</span><span class="p">(</span><span class="n">interval</span><span class="p">)</span>
    <span class="n">q</span> <span class="o">=</span> <span class="n">Queue</span><span class="p">()</span>
    <span class="n">threads</span> <span class="o">=</span> <span class="p">[</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">show_thread</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;</span><span class="si">%s</span><span class="s"> T</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span> 
                                 <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="p">)</span>
                                 <span class="p">)</span>
                <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="mi">3</span><span class="p">)</span>
              <span class="p">]</span>
    <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
        <span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
    <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
        <span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
    <span class="k">while</span> <span class="ow">not</span> <span class="n">q</span><span class="o">.</span><span class="n">empty</span><span class="p">():</span>
        <span class="k">print</span> <span class="n">q</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
    <span class="k">print</span>
    <span class="k">return</span>

<span class="n">run_threads</span><span class="p">(</span><span class="s">&#39;Default&#39;</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<span class="n">run_threads</span><span class="p">(</span><span class="s">&#39;Custom&#39;</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</pre></div>
</div>
<p>When the check interval is smaller than the number of bytecodes in a
thread, the interpreter may give another thread control so that it
runs for a while.  This is illustrated in the first set of output
where the check interval is set to 100 (the default) and 1000 extra
loop iterations are performed for each step through the <tt class="docutils literal"><span class="pre">i</span></tt> loop.</p>
<p>On the other hand, when the check interval is <em>greater</em> than the
number of bytecodes being executed by a thread that doesn&#8217;t release
control for another reason, the thread will finish its work before the
interval comes up.  This is illustrated by the order of the name
values in the queue in the second example.</p>
<div class="highlight-python"><pre>$ python sys_checkinterval.py
Default interval = 10 with 1000 extra operations
Default T0
Default T0
Default T0
Default T1
Default T2
Default T2
Default T0
Default T1
Default T2
Default T0
Default T1
Default T2
Default T1
Default T2
Default T1

Custom interval = 10 with 0 extra operations
Custom T0
Custom T0
Custom T0
Custom T0
Custom T0
Custom T1
Custom T1
Custom T1
Custom T1
Custom T1
Custom T2
Custom T2
Custom T2
Custom T2
Custom T2</pre>
</div>
<p>Modifying the check interval is not as clearly useful as it might
seem.  Many other factors may control the context switching behavior
of Python&#8217;s threads.  For example, if a thread performs I/O, it
releases the GIL and may therefore allow another thread to take over
execution.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">from</span> <span class="nn">Queue</span> <span class="kn">import</span> <span class="n">Queue</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="k">def</span> <span class="nf">show_thread</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="p">):</span>
    <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="mi">5</span><span class="p">):</span>
        <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">extraByteCodes</span><span class="p">):</span>
            <span class="k">pass</span>
        <span class="c">#q.put(threading.current_thread().name)</span>
        <span class="k">print</span> <span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">()</span><span class="o">.</span><span class="n">name</span>
    <span class="k">return</span>

<span class="k">def</span> <span class="nf">run_threads</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="p">):</span>
    <span class="k">print</span> <span class="s">&#39;</span><span class="si">%(prefix)s</span><span class="s"> interval = </span><span class="si">%(interval)s</span><span class="s"> with </span><span class="si">%(extraByteCodes)s</span><span class="s"> extra operations&#39;</span> <span class="o">%</span> <span class="nb">locals</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">setcheckinterval</span><span class="p">(</span><span class="n">interval</span><span class="p">)</span>
    <span class="n">q</span> <span class="o">=</span> <span class="n">Queue</span><span class="p">()</span>
    <span class="n">threads</span> <span class="o">=</span> <span class="p">[</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">show_thread</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;</span><span class="si">%s</span><span class="s"> T</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span> 
                                 <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="p">)</span>
                                 <span class="p">)</span>
                <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="mi">3</span><span class="p">)</span>
              <span class="p">]</span>
    <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
        <span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
    <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
        <span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
    <span class="k">while</span> <span class="ow">not</span> <span class="n">q</span><span class="o">.</span><span class="n">empty</span><span class="p">():</span>
        <span class="k">print</span> <span class="n">q</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
    <span class="k">print</span>
    <span class="k">return</span>

<span class="n">run_threads</span><span class="p">(</span><span class="s">&#39;Default&#39;</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<span class="n">run_threads</span><span class="p">(</span><span class="s">&#39;Custom&#39;</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">extraByteCodes</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</pre></div>
</div>
<p>This example is modified from the first so that the thread prints
directly to <tt class="xref py py-const docutils literal"><span class="pre">sys.stdout</span></tt> instead of appending to a queue.  The
output is much less predictable.</p>
<div class="highlight-python"><pre>$ python sys_checkinterval_io.py
Default interval = 100 with 1000 extra operations
Default T0
Default T1
Default T1Default T2

Default T0Default T2

Default T2
Default T2
Default T1
Default T2
Default T1
Default T1
Default T0
Default T0
Default T0

Custom interval = 10 with 0 extra operations
Custom T0
Custom T0
Custom T0
Custom T0
Custom T0
Custom T1
Custom T1
Custom T1
Custom T1
Custom T2
Custom T2
Custom T2
Custom T1Custom T2

Custom T2</pre>
</div>
<div class="admonition-see-also admonition seealso">
<p class="first admonition-title">See also</p>
<dl class="last docutils">
<dt><a class="reference internal" href="../dis/index.html#module-dis" title="dis: Python Bytecode Disassembler"><tt class="xref py py-mod docutils literal"><span class="pre">dis</span></tt></a></dt>
<dd>Disassembling your Python code with the dis module is one way
to count bytecodes.</dd>
</dl>
</div>
</div>
<div class="section" id="debugging">
<h2>Debugging<a class="headerlink" href="#debugging" title="Permalink to this headline">¶</a></h2>
<p>Identifying deadlocks can be on of the most difficult aspects of
working with threads.  <tt class="xref py py-func docutils literal"><span class="pre">sys._current_frames()</span></tt> can help by showing
exactly where a thread is stopped.</p>
<div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
<span class="c"># encoding: utf-8</span>

<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="n">io_lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
<span class="n">blocker</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">()</span>
    <span class="k">with</span> <span class="n">io_lock</span><span class="p">:</span>
        <span class="k">print</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s"> with ident </span><span class="si">%s</span><span class="s"> going to sleep&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">ident</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">i</span><span class="p">:</span>
        <span class="n">blocker</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="c"># acquired but never released</span>
        <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.2</span><span class="p">)</span>
    <span class="k">with</span> <span class="n">io_lock</span><span class="p">:</span>
        <span class="k">print</span> <span class="n">t</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s">&#39;finishing&#39;</span>
    <span class="k">return</span>

<span class="c"># Create and start several threads that &quot;block&quot;</span>
<span class="n">threads</span> <span class="o">=</span> <span class="p">[</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">block</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">i</span><span class="p">,))</span> <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="mi">3</span><span class="p">)</span> <span class="p">]</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
    <span class="n">t</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
    <span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>

<span class="c"># Map the threads from their identifier to the thread object</span>
<span class="n">threads_by_ident</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">t</span><span class="o">.</span><span class="n">ident</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">)</span>

<span class="c"># Show where each thread is &quot;blocked&quot;</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span>
<span class="k">with</span> <span class="n">io_lock</span><span class="p">:</span>
    <span class="k">for</span> <span class="n">ident</span><span class="p">,</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">_current_frames</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
        <span class="n">t</span> <span class="o">=</span> <span class="n">threads_by_ident</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ident</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">t</span><span class="p">:</span>
            <span class="c"># Main thread</span>
            <span class="k">continue</span>
        <span class="k">print</span> <span class="n">t</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s">&#39;stopped in&#39;</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_code</span><span class="o">.</span><span class="n">co_name</span><span class="p">,</span> 
        <span class="k">print</span> <span class="s">&#39;at line&#39;</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_lineno</span><span class="p">,</span> <span class="s">&#39;of&#39;</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_code</span><span class="o">.</span><span class="n">co_filename</span>

<span class="c"># Let the threads finish</span>
<span class="c"># for t in threads:</span>
<span class="c">#     t.join()</span>
</pre></div>
</td></tr></table></div>
<p>The dictionary returned by <tt class="xref py py-func docutils literal"><span class="pre">sys._current_frames()</span></tt> is keyed on the
thread identifier, rather than its name.  A little work is needed to
map those identifiers back to the thread object.</p>
<p>Since <strong>Thread-1</strong> does not sleep, it finishes before its status is
checked.  Since it is no longer active, it does not appear in the
output.  <strong>Thread-2</strong> acquires the lock <em>blocker</em>, then sleeps for a
short period.  Meanwhile <strong>Thread-3</strong> tries to acquire <em>blocker</em> but
cannot because <strong>Thread-2</strong> already has it.</p>
<div class="highlight-python"><pre>$ python sys_current_frames.py

Thread-1 with ident 4300550144 going to sleep
Thread-1 finishing
Thread-2 with ident 4301086720 going to sleep
Thread-3 with ident 4302835712 going to sleep
Thread-3 stopped in block at line 16 of sys_current_frames.py
Thread-2 stopped in block at line 17 of sys_current_frames.py</pre>
</div>
<div class="admonition-see-also admonition seealso">
<p class="first admonition-title">See also</p>
<dl class="last docutils">
<dt><a class="reference internal" href="../threading/index.html#module-threading" title="threading: Manage several concurrent threads of execution."><tt class="xref py py-mod docutils literal"><span class="pre">threading</span></tt></a></dt>
<dd>The threading module includes classes for creating Python threads.</dd>
<dt><a class="reference internal" href="../Queue/index.html#module-Queue" title="Queue: Provides a thread-safe FIFO implementation"><tt class="xref py py-mod docutils literal"><span class="pre">Queue</span></tt></a></dt>
<dd>The Queue module provides a thread-safe implementation of a FIFO data structure.</dd>
<dt><a class="reference external" href="http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/">Python Threads and the Global Interpreter Lock</a></dt>
<dd>Jesse Noller&#8217;s article from the December 2007 issue of Python Magazine.</dd>
<dt><a class="reference external" href="http://www.dabeaz.com/python/GIL.pdf">Inside the Python GIL</a></dt>
<dd>Presentation by David Beazley describing thread implementation and performance issues, including how the check interval and GIL are related.</dd>
</dl>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="imports.html" title="Modules and Imports"
             >next</a> |</li>
        <li class="right" >
          <a href="tracing.html" title="Tracing a Program As It Runs"
             >previous</a> |</li>
        <li><a href="../contents.html">PyMOTW</a> &raquo;</li>
          <li><a href="../runtime_services.html" >Python Runtime Services</a> &raquo;</li>
          <li><a href="index.html" >sys &#8211; System-specific Configuration</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
      &copy; Copyright Doug Hellmann.
      Last updated on Oct 24, 2010.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>.

    <br/><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/" rel="license"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png"/></a>
    
    </div>
  </body>
</html>

[top] / python / PyMOTW / docs / sys / threads.html

contact | logmethods.com