线程是操作系统能够进行运算调度的最小单位。进程被包含在进程中,是进程中实际处理单位。一条线程就是一堆指令集合。
一条线程是指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
下面来看一下在python中最简单的一个多线程模型:
import threading
import time
def mission1(num):
for i in range(0, num):
print("mission1......" + str(i))
time.sleep(1) # 此处要插入间隔,否则看不出多线程的区别
def mission2(num):
for i in range(0, num):
print("mission2......" + str(i))
time.sleep(1)
if __name__ == '__main__':
m1 = threading.Thread(target=mission1, args=(5, )) # target为任务名,args为传递进任务的参数
m2 = threading.Thread(target=mission2, args=(5, ))
m1.start() # 开始任务
m2.start()
在执行后,我们可以看到如下的结果:
上次逛贴吧看到了个异想天开的想法,假设你银行卡里有1000块,使用两台机器同时登入这张卡(这里槽点就已经很大了,但请忽略),此时两台机器所识别的这张卡的余额都是1000块,这时候操作机器的两个人同时按下取款1000块,机器就会吐出2000块。
按照这位朋友的想法,用代码模拟大概是这个样子:
import threading
import time
account = 1000
def withdraw(num):
global account
if num <= account:
time.sleep(1) # 给予判断的余地
t = account - num
account = t
print("已取出" + str(num))
else:
print("余额不足")
if __name__ == '__main__':
m1 = threading.Thread(target=withdraw, args=(1000, ))
m2 = threading.Thread(target=withdraw, args=(1000, ))
m1.start()
m2.start()
才怪。
现实生活中,不说两台机器读一张卡的神奇操作,在线程锁的存在下,这种一生二,二生三,三生万物的操作也是不存在的。
多个线程同时执行任务,且访问同一资源时,对资源的同步操作很可能会导致很大的安全隐患。
线程锁就是保护公共资源,一次只能让一个线程访问。
代码如下所示。
import threading
import time
account = 1000
def withdraw(num):
global account
lock.acquire() # 加锁
if num <= account:
time.sleep(1) # 给予判断的余地
t = account - num
account = t
print("已取出" + str(num))
else:
print("余额不足")
lock.release() # 解锁
if __name__ == '__main__':
lock = threading.Lock() # 生成锁
m1 = threading.Thread(target=withdraw, args=(1000, ))
m2 = threading.Thread(target=withdraw, args=(1000, ))
m1.start()
m2.start()
关于threading剩下的操作等下篇文章介绍吧(如果有的话)
转载注明出处