一、线程的概念
1、线程的概念
在Python中,想要实现多任务还可以使用多线程来完成。
2、为什么使用多线程?
进程是分配资源的最小单位 , 一旦创建一个进程就会分配一定的资源 , 就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的 .
线程是<font color="red">程序执行的最小单位</font> , 实际上进程只负责分配资源 , 而利用这些资源执行程序的是线程 , 也就说进程是线程的容器 , 一个进程中最少有一个线程来负责执行程序 。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程<font color="red">共享进程所拥有的全部资源</font> 。这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样 , 实现多任务的同时也节省了资源。
3、多线程的作用
def func_a(): print('任务A') def func_b(): print('任务B') func_a() func_b()
☆ 单线程执行
☆ 多线程执行
二、多线程完成多任务
1、多线程完成多任务
① 导入线程模块 import threading ② 通过线程类创建线程对象 线程对象 = threading.Thread(target=任务名) ② 启动线程执行任务 线程对象.start()
参数名 | 说明 |
---|---|
target | 执行的目标任务名,这里指的是函数名(方法名) |
name | 线程名,一般不用设置 |
group | 线程组,目前只能使用None |
2、线程创建与启动代码
单线程案例:
import time def music(): for i in range(3): print('听音乐...') time.sleep(0.2) def coding(): for i in range(3): print('敲代码...') time.sleep(0.2) if __name__ == '__main__': music() coding()
多线程案例:
import time import threading def music(): for i in range(3): print('听音乐...') time.sleep(0.2) def coding(): for i in range(3): print('敲代码...') time.sleep(0.2) if __name__ == '__main__': music_thread = threading.Thread(target=music) coding_thread = threading.Thread(target=coding) music_thread.start() coding_thread.start()
3、线程执行带有参数的任务
参数名 | 说明 |
---|---|
args | 以元组的方式给执行任务传参 |
kwargs | 以字典方式给执行任务传参 |
import time import threading def music(num): for i in range(num): print('听音乐...') time.sleep(0.2) def coding(count): for i in range(count): print('敲代码...') time.sleep(0.2) if __name__ == '__main__': music_thread = threading.Thread(target=music, args=(3, )) coding_thread = threading.Thread(target=coding, kwargs={'count': 3}) music_thread.start() coding_thread.start()
4、主线程和子线程的结束顺序
import time import threading def work(): for i in range(10): print('work...') time.sleep(0.2) if __name__ == '__main__': # 创建子进程 work_thread = threading.Thread(target=work) # 启动线程 work_thread.start() # 延时1s time.sleep(1) print('主线程执行完毕')
☆ 设置守护线程方式一
import time import threading def work(): for i in range(10): print('work...') time.sleep(0.2) if __name__ == '__main__': # 创建子线程并设置守护主线程 work_thread = threading.Thread(target=work, daemon=True) # 启动线程 work_thread.start() # 延时1s time.sleep(1) print('主线程执行完毕')
☆ 设置守护线程方式二
import time import threading def work(): for i in range(10): print('work...') time.sleep(0.2) if __name__ == '__main__': # 创建子线程 work_thread = threading.Thread(target=work) # 设置守护主线程 work_thread.setDaemon(True) # 启动线程 work_thread.start() # 延时1s time.sleep(1) print('主线程执行完毕')
5、线程间的执行顺序
for i in range(5): sub_thread = threading.Thread(target=task) sub_thread.start()
思考:当我们在进程中创建了多个线程,其线程之间是如何执行的呢?按顺序执行?一起执行?还是其他的执行方式呢?
答:线程之间的执行是无序的,验证
☆ 获取当前线程信息
# 通过current_thread方法获取线程对象 current_thread = threading.current_thread() # 通过current_thread对象可以知道线程的相关信息,例如被创建的顺序 print(current_thread)
☆ 线程间的执行顺序
import threading import time def get_info(): # 可以暂时先不加,查看效果 time.sleep(0.5) current_thread = threading.current_thread() print(current_thread) if __name__ == '__main__': # 创建子线程 for i in range(10): sub_thread = threading.Thread(target=get_info) sub_thread.start()
总结:线程之间执行是无序的,是由CPU调度决定某个线程先执行的。
6、线程间共享全局变量
☆ 线程间共享全局变量
多个线程都是在同一个进程中 , 多个线程使用的资源都是<font color="red">同一个进程中的资源</font> ,因此多线程间是共享全局变量
示例代码:
import threading import time my_list = [] def write_data(): for i in range(3): print('add:', i) my_list.append(i) print(my_list) def read_data(): print('read:', my_list) if __name__ == '__main__': write_thread = threading.Thread(target=write_data) read_thread = threading.Thread(target=read_data) write_thread.start() time.sleep(1) read_thread.start()
7、总结:进程和线程对比
☆ 关系对比
① 线程是依附在进程里面的,没有进程就没有线程。
② 一个进程默认提供一条线程,进程可以创建多个线程。
☆ 区别对比
① 进程之间不共享全局变量
② 线程之间共享全局变量
③ 创建进程的资源开销要比创建线程的资源开销要大
④ 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
☆ 优缺点对比
① 进程优缺点:
优点:可以用多核
缺点:资源开销大
② 线程优缺点
优点:资源开销小文章来源:https://www.toymoban.com/news/detail-846701.html
缺点:不能使用多核文章来源地址https://www.toymoban.com/news/detail-846701.html
到了这里,关于浅谈对线程的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!