python程序中的线程操作
一、什么是线程?
引子:
进程:资源单位(起一个进程,仅仅只是在内存空间中开辟一块独立的空间)。
线程:执行单位(真正干活的人也就是真正被CPU执行的,是进程里面的线程。线程指的是代码的执行过程,执行代码中所需要使用到的资源都找所在的进程索要)。
将操作系统比喻一个大的工厂,
那么进程就相当于工厂里的车间。
线程就是车间里面的流水线。
每一个进程肯定自带一个线程。
总结:
进程和线程都是虚拟单位,只是为了我们更加方便的描述问题
二、为何要有线程?
对比分析:
开设进程:
1、申请内存空间 耗资源
2、‘拷贝代码’ 耗资源
开设线程:
一个进程内可以开设多个线程,在同一个进程内开设多个线程无需再申请内存空间。
总结:
1、开设线程的开销远远小于开设进程的开销。
2、同一个进程下的多个线程数据是共享的。
我们要开发一款文本编辑器:
需求:获取用户输入的功能、实时展示到屏幕的功能、自动保存到硬盘的功能
针对上面的三个功能,开设进程还是线程?
答案:开设三个线程处理上面的三个功能更加的合理。
三、如何使用线程?
# encoding=utf-8
# auther:lsj
# 开启线程的方式一
from multiprocessing import Process
from threading import Thread
import time
def task(name):
print('%s is running'%name)
time.sleep(1)
print('%s is over'%name)
# 开启线程不需要在main下面执行代码,直接书写即可
# 但是我们还是习惯性的将启动命令写在main下面
t = Thread(target=task,args=('lsj',))
t.start()
print('主')
运行结果如下:
lsj is running主
lsj is over
线程与进程的区别:
1、进程的时候“主”先打印,线程的时候代码先打印。
2、创建进程需要先申请内存空间,而创建线程不需要申请内存空间。
3、创建线程的开销非常小,几乎是代码一执行线程就已经创建了。
4、开启线程不需要在main下面执行代码,直接书写即可,开启进程时windows系统下必须使用main。
# encoding=utf-8
# auther:lsj
# 开启线程的方式一
from multiprocessing import Process
from threading import Thread
import time
def task(name):
print('%s is running'%name)
time.sleep(1)
print('%s is over'%name)
# 开启线程不需要在main下面执行代码,直接书写即可
# 但是我们还是习惯性的将启动命令写在main下面
# t = Thread(target=task,args=('lsj',))
# t.start()
# print('主')
# 对比进程
if __name__ == '__main__':
p = Process(target=task,args=('lsj',))
p.start()
print('主')
进程的运行结果如下:
主
lsj is running
lsj is over
# encoding=utf-8
# auther:lsj
# 开启线程的方式二,使用类继承
from multiprocessing import Process
from threading import Thread
import time
class MyThread(Thread):
def __init__(self,name): # 针对双下划线开头和双下划线结尾(__init__)的方法 统一读成 双下init
# 重写别人的方法又不知道别人的方法里有啥 调用父类的方法
super().__init__()
self.name = name
def run(self):
print('%s is running'%self.name)
time.sleep(1)
print('牛')
if __name__ == '__main__':
t = MyThread('lsj')
t.start()
print('主')
运行结果:
lsj is running主
牛
四、线程对象的join方法
# encoding=utf-8
# auther:lsj
# 线程的join方法
from multiprocessing import Process
import time
from threading import Thread
def task(name):
print('%s is running'%name)
time.sleep(3)
print('%s is over'%name)
if __name__ == '__main__':
t = Thread(target=task,args=('lsj',))
t.start()
t.join() # 主线程要等待子线程运行完毕再继续运行
print('主')
不加join运行结果:
lsj is running
主
lsj is over
加入join运行结果:
lsj is running
lsj is over
主