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