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>> _start_new_thread(</code><code>self</code><code>.__bootstrap, ()) </code><code>-</code><code>> </code><code>self</code><code>.__bootstrap_inner() </code><code>-</code><code>> </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