首页 > 编程语言 > 详细

Python多线程

时间:2019-04-07 11:19:16      阅读:117      评论:0      收藏:0      [点我收藏+]

Python中的threading模块提供了对用线程的相关操作,线程是应用程序中工作的最小单元。

1.Thread类

Thread是线程类,有两种使用方法,从Thread类继承并覆盖run方法,或者直接传入要运行的方法。

 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 def func():
 7     time.sleep(2)
 8     print("func")
 9 
10 def main():
11     t = threading.Thread(target=func)  # 将要执行的方法作为参数传递给Thread类的构造方法
12     t.start()
13 
14 
15 16 
17 if __name__ == __main__:
18     main()
19   print("the main thread is end")
 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 class MyThread(threading.Thread):
 7     def __init__(self):
 8         super(MyThread, self).__init__()  # 一定要显示的调用父类的初始化方法
 9 
10     def run(self):  # 覆盖run方法
11         time.sleep(2)
12         print("func")
13 
14 
15 def main():
16     t = MyThread()
17     t.start()
18 
19 
20 if __name__ == __main__:
21     main()
22     print("the main thread is end")

Thread类的构造方法:

Thread(group=None,target=None,name=None,args=(),kwargs={})

group:线程组,还未实现。

target:要执行的方法;

name:线程名;

args/kwargs:要传入的方法的参数;

Thread实例的方法:

isAlive:县城是否还在运行。

get/setName(name):获取/设置线程名

start():线程准备就绪,等待CPU调度。

is/setDaemon(bool):获取/设置是后台线程,在start之前进行设置。

说明:如果是后台线程,主线程执行完毕后,不论后台线程成功与否,主线程和后台线程均会停止;如果是前台线程,主线程执行完毕后,需要等待后台线程执行完毕后,程序才会停止。

start():启动线程。

join(timeout):阻塞当前上下文环境线程,直到调用此方法的线程终止或达到设置的超时时间(timeout)。

示例

未设置isDaemon:

 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 def func():
 7     time.sleep(2)
 8     print("func--", threading.current_thread().getName())
 9 
10 def main():
11     t = threading.Thread(target=func)
12     t.start()
13 
14 
15 if __name__ == __main__:
16     main()
17     print("main thread is end")
18 
19 
20 -----输出结果-----
21 
22 main thread is end
23 func-- Thread-1

当没有设置Daemon的情况下(默认为false),主线程执行结束后,需要等待前台线程执行完之后,程序才会停止。

设置isDaemon为True:

 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 def func():
 7     time.sleep(2)
 8     print("func--", threading.current_thread().getName())
 9 
10 def main():
11     t = threading.Thread(target=func)
12     t.setDaemon(True)
13     t.start()
14 
15 
16 if __name__ == __main__:
17     main()
18     print("main thread is end")
19 
20 -------输出结果--------
21 main thread is end

当设置了Dameon为True时,当主线程执行完毕后,程序即结束,不会等待后台线程执行完之后再结束程序。

设置join:

join的作用是完成线程的同步,也就是主线程执行完毕之后,进入阻塞状态,一直等到其他的子线程执行完毕后,主线程才结束。

 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 def func():
 7     time.sleep(2)
 8     print("func--", threading.current_thread().getName())
 9 
10 def main():
11     for i in range(5):
12         t = threading.Thread(target=func)
13         t.setDaemon(True)
14         t.start()
15         t.join()
16 
17 
18 if __name__ == __main__:
19     main()
20     print("main thread is end")
21 
22 ------输出结果--------
23 
24 func-- Thread-1
25 func-- Thread-2
26 func-- Thread-3
27 func-- Thread-4
28 func-- Thread-5
29 main thread is end

线程锁:

由于线程之间可以共享数据,在多个线程同时操作一个变量时,可能会产生数据混乱,如下示例:

 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 num = 0
 7 
 8 def func(n):
 9     global num
10     time.sleep(1)
11     num = num + n
12     print(num)
13 
14 
15 if __name__ == __main__:
16 
17     for i in range(10):
18         t = threading.Thread(target=func, args=(i, ))
19         t.start()
20 
21 -------输出结果-------
22 
23 2
24 2
25 3
26 6
27 14
28 21
29 26
30 32
31 36
32 45

数据混乱,我们想要的是0,1,3,6,10....,现在使用Lock进行加锁:

 1 # -*- coding:utf-8 -*-
 2 
 3 import threading
 4 import time
 5 
 6 num = 0
 7 lock = threading.Lock()
 8 
 9 
10 def func(n):
11     lock.acquire()
12     global num
13     time.sleep(1)
14     num = num + n
15     print(num)
16     lock.release()
17 
18 
19 if __name__ == __main__:
20 
21     for i in range(10):
22         t = threading.Thread(target=func, args=(i, ))
23         t.start()
24 
25 -------输出结果---------
26 
27 0
28 1
29 3
30 6
31 10
32 15
33 21
34 28
35 36
36 45

 

Python多线程

原文:https://www.cnblogs.com/zhuzhaoli/p/10664359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!