搜索
登录
注册
×
欢迎来到小雕博客,玩的开心。
多线程——thread的基本使用
博主:
alone
发布时间:
2020-04-11T13:20:54Z
378次浏览
0 条评论
## 一、多任务介绍及Thread的基本使用 什么叫多任务呢? 简单地说,就是操作系统可以同时运行多个任务,有些事情是需要同时实现的,比如一边唱歌,一边跳舞,这就是多任务。 这里我们举个例子。 首先,按照传统的方式,分别创建一个唱歌和跳舞的方法,在让他们分别每隔1s打印响应的log。 ```python import time def sing(): for i in range(4): print("------唱歌:天下-------") time.sleep(1) def dance(): for i in range(4): print("------跳舞----------") time.sleep(1) def main(): sing() dance() if __name__ == '__main__': main() ``` 从输出结果我们可以看到,  他是先运行完`sing()`方法,再运行`dance()`方法,这就导致了整个程序的运行时间为10s,这已经违背了我们的意图。 这里就需要是用一个python自带的库,叫**threading**库可以很方便的解决多任务同时发生的需求,实例如下: ```python import time import threading def sing(): for i in range(4): print("------唱歌:天下-------") time.sleep(1) def dance(): for i in range(4): print("------跳舞----------") time.sleep(1) def main(): t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) t1.start() t2.start() if __name__ == '__main__': main() ``` 从输出结果可以看到 他每次运行的时候,会一次性运行两个方法,这就是多任务——**线程**的目的。 1. 现在,多核CPU已经非常普及了,但是单核CPU是怎么执行多任务的呢?答案就是:操作系统轮流让各个任务交替执行,任务1执行0.01s,任务2执行0.01s,任务3执行0.01s······这样反复执行下去,表面上看,每个任务都是交替执行的,但是由于CPU的执行速度实在太快了,我们感觉就像是多任务在同时执行一样,这个被称作**并发**:假的多任务。 2. **并行**:真的多任务,真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会西东吧多任务轮流调度到每个核心上执行。 3. 大部分都是并发。因为电脑上同时运行的任务数一般都是大于你的电脑核数的(现在基本是4核) ## 二、Thread创建线程,完成多任务 python的`thread`模块是比较底层的模块,python的`threading`是对thread进行包装的,可以更加方便的被使用。 #### 1、使用threading模块 ##### 单线程执行 ```python import time def saySorry(): print("亲爱的,我错了,我能吃饭了吗?") time.sleep(1) if __name__ == "__main__": for i in range(5): saySorry() ``` ##### 多线程执行 ```python import threading import time def saySorry(): print("亲爱的,我错了,我能吃饭了吗?") time.sleep(1) if __name__ == "__main__": for i in range(5): t = threading.Thread(target=saySorry) t.start() #启动线程,即让线程开始执行 ``` **说明** 1. 可以明显看出使用了多线程并发的操作,花费时间要短很多 2. 当调用start()时,才会真正的创建线程,并且开始执行 3. 主线程会等待所有子线程结束后才结束 ## 3、查看线程数 ```python import threading import time def test1(): for i in range(5): print('-----test1-------%d' % i) time.sleep(1) # 如果创建Thread是执行的函数运行结束,那就意味着,这个子线程结束了 def test2(): for i in range(6): print('-----test2-------%d' % i) time.sleep(1) def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() t2.start() while True: print(threading.enumerate()) if len(threading.enumerate()) <= 1: break time.sleep(1) if __name__ == '__main__': main() ``` 这里我们使用`sleep`来确保打印当前线程的主线程和两个子线程能够交替执行,而不是一个线程执行完毕,再打开另一个线程。 运行结果: ```python -----test1-------0 -----test2-------0 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-1, started 30448)>, <Thread(Thread-2, started 32508)>] -----test1-------1 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-1, started 30448)>, <Thread(Thread-2, started 32508)>] -----test2-------1 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-1, started 30448)>, <Thread(Thread-2, started 32508)>] -----test1-------2 -----test2-------2 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-1, started 30448)>, <Thread(Thread-2, started 32508)>] -----test2-------3 -----test1-------3 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-1, started 30448)>, <Thread(Thread-2, started 32508)>] -----test2-------4 -----test1-------4 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-1, started 30448)>, <Thread(Thread-2, started 32508)>] -----test2-------5 [<_MainThread(MainThread, started 28972)>, <Thread(Thread-2, started 32508)>] [<_MainThread(MainThread, started 28972)>] ``` 可以看到,刚开始的时候,是一个主线程(打印当前线程数),两个子线程(分别是两个test函数),随着程序的执行,当其中一个子线程执行完毕的时候,线程数就剩余两个了。 并且当两个子线程结束后,程序内只剩余一个主线程。
き 赞赏
如果觉得我的文章对你有用,请随意赞赏
×
Close
赞赏作者
扫一扫支付
支付宝支付
微信支付
发表评论
发表评论
评论内容