什么是多线程:
进程:正在运行的程序,QQ 360 ......
线程:就是进程中一条执行程序的执行路径,一个程序至少有一条执行路径。(360中的杀毒 电脑体检 电脑清理 同时运行的话就需要开启多条路径)
每个线程都有自己需要运行的内容,而这些内容可以称为线程要执行的任务。
开启多线程是为了同时运行多部分代码。
好处:解决了多部分需要同时运行的问题
弊端:如果线程过多,会导致效率很低(因为程序的执行都是CPU做着随机 快速切换来完成的)
- 线程与进程的区别
- 线程共享内存,进程独立内存
- 线程启动速度块,进程启动速度慢,运行时速度没有可比性
- 同一个进程的线程间可以直接交流,两个进程想通信,必须通过一个中间代理来实现
- 创建新线程很简单,创建新进程需要对其父进程进行一次克隆
- 一个线程可以控制和操作同一线程里的其他线程,但是进程只能操作子进程
threading模块
-
多线程的使用方式一:直接使用
# -*- coding:utf-8 -*- # 线程使用的方式一 import threading import time # 需要多线程运行的函数 def fun(args): print("我是线程%s" % args) time.sleep(2) print("线程%s运行结束" % args) # 创建线程 t1 = threading.Thread(target=fun, args=(1,)) t2 = threading.Thread(target=fun, args=(2,)) start_time = time.time() t1.start() t2.start() end_time = time.time() print("两个线程一共的运行时间为:", end_time-start_time) print("主线程结束") """ 运行结果: 我是线程1 我是线程2两个线程一共的运行时间为: 0.0010077953338623047 主线程结束 线程1运行结束 线程2运行结束 """
-
线程的第二种使用方式:继承式调用
# 继承式调用 import threading import time class MyThreading(threading.Thread): def __init__(self, name): super(MyThreading, self).__init__() self.name = name # 线程要运行的代码 def run(self): print("我是线程%s" % self.name) time.sleep(2) print("线程%s运行结束" % self.name) t1 = MyThreading(1) t2 = MyThreading(2) start_time = time.time() t1.start() t2.start() end_time = time.time() print("两个线程一共的运行时间为:", end_time-start_time) print("主线程结束") """ 运行结果: 我是线程1 我是线程2 两个线程一共的运行时间为: 0.0010724067687988281 主线程结束 线程2运行结束 线程1运行结束 """
守护线程与join方法
- 在Python多线程编程中,join方法的作用式线程同步。
- 守护线程,是为守护别人而存在的,当设置为守护线程后,被守护的主线程不存在后,守护线程也自然不存在。
- 第一种:python多线程默认情况
- Python多线程默认情况(设置线程setDaemon(False)),主线程执行完自己的任务后,就退出了,此时子线程会继续执行自己的任务,直到子线程任务结束
- 代码演示:threading中的两个创建多线成的例子都是。
- 第二种:开启守护线程
- 开启线程的setDaemon(True)),设置子线程为守护线程,实现主程序结束,子程序立马全部结束功能
- 代码演示:
守护线程
# 守护线程 import threading import time class MyThreading(threading.Thread): def __init__(self, name): super(MyThreading, self).__init__() self.name = name # 线程要运行的代码 def run(self): print("我是线程%s" % self.name) time.sleep(2) print("线程%s运行结束" % self.name) t1 = MyThreading(1) t2 = MyThreading(2) start_time = time.time() t1.setDaemon(True) t1.start() t2.setDaemon(True) t2.start() end_time = time.time() print("两个线程一共的运行时间为:", end_time-start_time) print("主线程结束")