说一下线程吧,计算机的进程估计大家都知道,就是一个一个运行着的程序,而每一个进程都最少有一个线程多线程就是同时运行多个线程还是看代码吧,这一块感觉不是很好说清楚
首先说下调用线程的模块threading,还是看代码吧,先说一个最基本的
import threading
from time import sleep
print('主线程开始')
def thread1():
print('我是线程1')
sleep(5)
print('线程1结束')
def thread2():
print('我是线程2')
sleep(2)
print('线程2结束')
t1 = threading.Thread(target=thread1)#target=thread1,是函数的入口,但是线程还没有开始
t2 = threading.Thread(target=thread2)
t1.start()#此时线程开始
t2.start()
t1.join()#此时主函数要等到子线程执行结束才能走主线程
t2.join()
sleep(1)
print('主线程结束')
这个如果能看明白那么再说一个带参数的
'''print('主线程开始')
def thread1(a,b):
print('我是线程1')
m = a + b
sleep(5)
print('线程1结束a+b的值是:',m)
def thread2(c,d):
print('我是线程2')
n = c * d
sleep(2)
print('线程2结束c * d的值是:',n)
t1 = threading.Thread(target=thread1,args=(3,5))#target=thread1,是函数的入口,但是线程还没有开始
t2 = threading.Thread(target=thread2,args=(5,3))#之所以传参用的是数组是因为Thread模块中这个地方是形参,
# 且是数值是数组,可以用Ctrl+鼠标左键查看该函数,所以要用数组,如果是一个参数时,一个参数后面要加逗号
t1.start()#此时线程开始
t2.start()
t1.join()#此时主函数要等到子线程执行结束才能走主线程
t2.join()
sleep(1)
print('主线程结束')
再看一下加锁的线程,这种情况是在两个函数共同调用一个公共资源时防止冲突时所采取的的措施,还是看代码
print('主线程开始')
#假设a 的钱一共有100,吃饭花了10,同时工作挣了5,问此时a的钱为多少
dic1 = {'a':100}
#使用Lock函数,返回一个锁对象,这是这个共享资源会被锁住
zhifubao_lock = threading.Lock()
def thread1(b):
print('我是线程1')
# 在代码访问共享对象之前加锁
# 当多个线程同时执行Lock.qcquire()时
# 只有一个线程能够成功的获取锁,然后继续执行代码
# 其他线程就继续等待,知道获得锁为止
zhifubao_lock.acquire()
dic1['a'] = dic1['a'] + b
# 访问完共享对象,释放锁
# 访问结束后,一定要调用Lock对象的release方法,进行解锁操作
# 否则其他等待锁的线程将永远等待下去,成为死程序
# 如果不释放相当于一个人上厕所之后门一直关着,下一个人是没有办法进去的
sleep(1)
print('线程1结束a的值是:',dic1['a'])
zhifubao_lock.release()
def thread2(d):
print('我是线程2')
zhifubao_lock.acquire()
dic1['a'] = dic1['a'] - d
sleep(2)
print('线程2结束a的值是:',dic1['a'])
zhifubao_lock.release()
t1 = threading.Thread(target=thread1,args=(1,))#target=thread1,是函数的入口,但是线程还没有开始
t2 = threading.Thread(target=thread2,args=(10,))#之所以传参用的是数组是因为Thread模块中这个地方是形参,
# 且是数值是数组,可以用Ctrl+鼠标左键查看该函数,所以要用数组,如果是一个参数时,一个参数后面要加逗号
t1.start()#此时线程开始
t2.start()
t1.join()#此时主函数要等到子线程执行结束才能走主线程
t2.join()
sleep(1)
print('主线程结束a的值是:',dic1['a'])