天天看點

39. Python 多線程執行個體 多線程鎖

1.多線程

多線程和多程序的表現形式差不多

IO密集型用多線程

線程是應用程式中的最小單元

多線程的實作有兩種方式:

方法一:

将要執行的方法作為參數傳給Thread的構造方法(和多程序類似)

<code>t </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>action, args</code><code>=</code><code>(i,))</code>

方法二:

從Thread繼承,并重寫run()

看源碼:

<code>P </code><code>=</code> <code>threading.Thread</code>

<code>p.start() </code><code>-</code><code>&gt; _start_new_thread(</code><code>self</code><code>.__bootstrap, ()) </code><code>-</code><code>&gt; </code><code>self</code><code>.__bootstrap_inner() </code><code>-</code><code>&gt; </code><code>self</code><code>.run()</code>

<code>try</code><code>:</code>

<code>    </code><code>if</code> <code>self</code><code>.__target:</code>

<code>        </code><code>self</code><code>.__target(</code><code>*</code><code>self</code><code>.__args, </code><code>*</code><code>*</code><code>self</code><code>.__kwargs)</code>

是以如果重寫了run,就直接調用run的函數了,如果run沒有重新,就調用target函數。

舉例:

<code>import</code> <code>threading</code>

<code>def</code> <code>worker(n):</code>

<code>    </code><code>print</code> <code>(</code><code>"start worker{0}"</code><code>.</code><code>format</code><code>(n))</code>

<code>class</code> <code>MyThread(threading.Thread):</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>, args):</code>

<code>        </code><code>super</code><code>(MyThread, </code><code>self</code><code>).__init__()</code>

<code>        </code><code>self</code><code>.args </code><code>=</code> <code>args</code>

<code>    </code><code>def</code> <code>run(</code><code>self</code><code>):</code>

<code>        </code><code>print</code> <code>(</code><code>"start MyThread{0}"</code><code>.</code><code>format</code><code>(</code><code>self</code><code>.args))</code>

<code>        </code> 

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(</code><code>1</code><code>, </code><code>6</code><code>):</code>

<code>        </code><code>t1 </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>worker, args</code><code>=</code><code>(i,))</code>

<code>        </code><code>t1.start()</code>

<code>    </code><code>t1.join()</code>

<code>    </code><code>for</code> <code>x </code><code>in</code> <code>xrange</code><code>(</code><code>6</code><code>, </code><code>11</code><code>):</code>

<code>        </code><code>t2 </code><code>=</code> <code>MyThread(x)</code>

<code>        </code><code>t2.start()</code>

<code>    </code><code>t2.join()</code>

傳回結果:

<code>start worker1</code>

<code>start worker2</code>

<code>start worker3</code>

<code>start worker4</code>

<code>start worker5</code>

<code>start MyThread6</code>

<code>start MyThread7</code>

<code>start MyThread8</code>

<code>start MyThread9</code>

<code>start MyThread10</code>

多線程鎖:

寫法與多程序很多都類似

通過threading.Lock()來建立鎖,函數在執行的隻有先要獲得鎖,然後執行完以後要釋放鎖:

<code>with lock:</code>

<code>lock.acquire()</code>

<code>lock.release()</code>

<code>import</code> <code>time</code>

<code>def</code>  <code>worker(name, lock):</code>

<code>    </code><code>with lock:</code>

<code>        </code><code>print</code> <code>(</code><code>"start {0}"</code><code>.</code><code>format</code><code>(name))</code>

<code>        </code><code>time.sleep(</code><code>1</code><code>)</code>

<code>        </code><code>print</code> <code>(</code><code>"end  {0}"</code><code>.</code><code>format</code><code>(name))</code>

<code>    </code><code>lock </code><code>=</code> <code>threading.Lock()</code>

<code>    </code><code>t1 </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>worker, args</code><code>=</code><code>(</code><code>"worker1"</code><code>,lock))</code>

<code>    </code><code>t2 </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>worker, args</code><code>=</code><code>(</code><code>"worker2"</code><code>,lock))</code>

<code>    </code><code>t1.start()</code>

<code>    </code><code>t2.start()</code>

<code>    </code><code>print</code> <code>(</code><code>"main end"</code><code>)</code>

<code>main end</code>

<code>end  worker1</code>

<code>end  worker2</code>

由結果可知:

按依次的順序來執行,誰先獲得這個鎖以後誰先來執行,當他執行完畢後,将鎖釋放掉,下一個函數來執行的時候,才能夠獲得鎖來執行。

本文轉自 聽丶飛鳥說 51CTO部落格,原文連結:http://blog.51cto.com/286577399/2050404