进程和线程的概念
进程:在操作系统上运行着的程序
线程: 线程是操作系统创建的,用来控制代码执行的数据结构,线程是操作系统可识别的最小执行和调度单位,代码在线程里运行;
每个进程里至少包含一个线程,一个线程只能属于一个进程
一个进程可以有多个线程,但至少有一个线程。
多线程类似于同时执行多个不同程序,多线程运行有如下优点:
- 使用线程可以把占据长时间的程序中的任务放到后台去处理。
- 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
- 程序的运行速度可能加快
- 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
线程库
代码通过系统调用,请求OS分配一个新的线程
在python里,threading库用来创建和管理线程
Threading
t1 = threading.Thread(target=函数对象)
多线程锁:在多个进程同时在操作共享资源时,需要创建进程锁,确保在同一时间只能有一个进程操作共享资源,比如余额宝里的金额,存钱和取钱不能多线程同时处理,必须等一个线程结束后另一个线程才能继续
import threading
from time import sleep
# 在代码访问共享对象之前,加锁
# 当多个线程同时执行lock.acquire()时,只有一个线程能成功地获锁,然后继续执行代码
# 其他代码就继续等待,直到获得锁为止
lock = threading.Lock()
print('Start your Test: ')
def hello(nsec):
lock.acquire() # 获取线程锁,锁定线程
print('Hello World start ...')
sleep(nsec)
print('Hello World end')
lock.release() # 释放线程锁
def Hi(nsec):
lock.acquire()
print('Hi start ...')
sleep(nsec)
print('Hi end')
lock.release()
# 访问结束,释放锁
# 访问结束后一定要调用Lock对象的release方法进行解锁,否则其他等待锁的线程将永远等待下去,成为死线程
t1 = threading.Thread(target=hello,args=(1,) ) #target=函数对象
t2 = threading.Thread(target=Hi,args=(2,))
# 开启新线程,才算是开始执行线程
t1.start()
t2.start()
# 等待t1结束线程
t1.join()
t2.join()
print('End your Test ')