python 多线程

Posted nul1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 多线程相关的知识,希望对你有一定的参考价值。

Python模块:threading

目录 00x1 多线程基础讲解
 00x2 简单多线程案例
 00x3 锁的概念
 00x4 习题作业

00x1 多线程基础讲解_↑↑↑↑↑↑↑↑↑↑↑↑↑

要使用多线程的函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行。

t = threading.Thread(target=worker)   #将worker函数实例化为Thread对象
t.start()    #实例化以后需要开始这个线程

由于python的多线程是伪多线程(并非真正意义的多线程)所以其线程并发出来的结果呈无规律状态。比如如下代码:

 1 #!/usr/bin/python
 2 # -*- coding: UTF-8 -*-
 3 #by def
 4 
 5 import threading
 6 
 7 def qwe():
 8     print 1
 9 
10 a = threading.Thread(target=qwe)
11 b = threading.Thread(target=qwe)
12     
13 a.start()
14 b.start()
15 print \'def\'
View Code

按照我惯例最后print的应该是最后输出才对,但实际运行了并非如此

执行结果:

之所以说python的多线程是伪的多线程就是因为如此。真正的多线程好比花了好几个人同时去工作直至把他做完。而python只是一个人只做一点就丢给另外一个人。每个人做一点,所以在很多时候就会导致线程还没有执行完毕就执行线程以外的东西。这里就引进了一个join。相当于一个线程的分界线,告诉Thread给你的任务先做完了你才能执行下面的代码。不然就打死你。

如此代码:

复制代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#by def

import threading

def qwe():
    print 1

a = threading.Thread(target=qwe)
b = threading.Thread(target=qwe) //两个线程
    
a.start()
b.start()
a.join()   #加上join了以后就不会逾越这个分界线了
b.join()
print \'def\'
复制代码
执行结果:

 但当线程有参数的时候呢? 

  t = threading.Thread(target=worker,args=(i,))


 00x2 简单案例_↑↑↑↑↑↑↑↑↑↑↑↑↑

 1 #!/usr/bin/python
 2 # -*- coding: UTF-8 -*-
 3 #by def
 4 
 5 import threading
 6 import time
 7 def a():
 8     time.sleep(2)
 9     print \'A Start\'
10     time.sleep(2)
11     print \'A End\'
12 def b():
13     time.sleep(2)
14     print \'B Start\'
15     time.sleep(2)
16     print \'B End\'
17 time1 = time.time()
18 a()
19 b()
20 print time.time()-time1
21 
22 没使用多线程案例 即为图一
View Code _1
 1 #!/usr/bin/python
 2 # -*- coding: UTF-8 -*-
 3 #by def
 4 
 5 import threading
 6 import time
 7 def a():
 8     time.sleep(2)
 9     print \'A Start\'
10     time.sleep(2)
11     print \'A End\'
12 def b():
13     time.sleep(2)
14     print \'B Start\'
15     time.sleep(2)
16     print \'B End\'
17 time1 = time.time()
18 q = threading.Thread(target=a)
19 w = threading.Thread(target=b)
20 q.start()
21 w.start()
22 q.join()
23 w.join()
24 print time.time()-time1
25 
26 使用多线程案例 即为图二
View Code _2

可见一个用了八秒一个用了四秒。


 00x3 锁的概念_↑↑↑↑↑↑↑↑↑↑↑↑↑

  00x2的简单案例重的图重可以看出图二(使用了多线程)的输出是有问题的。再次证明了其伪多线程特征。那么他既然是一个人干一下活就丢给别人干,我们就让其干完了再干下一个活。这里就涉及到一个锁的概念。先关到小黑屋先干好了。然后再打开门。换另外一个小黑屋继续干。切记,【进屋子要关锁,出来的时候要开锁】(言下之意就是在你要执行的代码执行之前关锁,执行完了要把锁关上)

  该种锁称之为“互斥锁”即LOCK,上锁:acquire 开锁:release

案例:

复制代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#by def

import threading
import time

mlock = threading.Lock()

def a():
    mlock.acquire() #加上
    time.sleep(2)
    print \'A Start\'
    time.sleep(2)
    print \'A End\'
    mlock.release() #开锁

q = threading.Thread(target=a)
q.start()
复制代码

 


 

00x4 习题作业_↑↑↑↑↑↑↑↑↑↑↑↑↑

题目:有10个刷卡机,代表建立10个线程,每个刷卡机每次扣除用户一块钱进入总账中,每个刷卡机每天一共被刷100次。账户原有500块。所以当天最后的总账应该为1500

答案:

复制代码
#encoding=utf-8
#by def

import threading
mLock = threading.Lock()

money = 500

def a():
    global money
    for i in xrange(100):
        mLock.acquire()
        money += 1
        mLock.release()

l = []
for i in xrange(10):
    t = threading.Thread(target=a)
    t.start()
    l.append(t)

for i in l:
    t.join()


print money
复制代码

以上是关于python 多线程的主要内容,如果未能解决你的问题,请参考以下文章

[Python3] 043 多线程 简介

python中的多线程和多进程编程

多线程 Thread 线程同步 synchronized

多个用户访问同一段代码

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

线程学习知识点总结