解释多任务之前,先了解几个概念。 当你的电脑是单核cpu时,如果需要执行多个程序,那么会给每个程序轮流分配时间段进行执行,比如每个程序分配0.0001秒的时间,这样的轮流执行的方式被称为时间片轮转。 并行:真的多任务,当cpu核数大于需要执行的任务时; 并发:假的多任务,当cpu核数小于需要执行的任务时,这里会采用时间片轮转的方式。也是我们电脑大多数执行任务时的方式。
t = threading.Thread(target=saySorry) # 创建一个实例对象,这个对象就是要启动的线程
t.start() # 启动线程,即让线程开始启动
import time
def saySorry():
print("亲爱的,我错了,我能吃饭了吗?")
time.sleep(1)
if __name__ = "__main__":
for i in range(5):
saySorry()
improt threading
import time
def saySorry():
print("亲爱的,我错了,我能吃饭了吗?")
time.sleep(1)
if __name__ = "__main__":
for i in range(5):
t = threading.Thread(target=saySorry) # 通过threading.Thread(target=函数名)创建线程
t.start() # 启动线程,即让线程开始执行
import threading
import time
def test1():
for i in range(5):
print("----------test1----%d------" % i)
time.sleep(1) # 延时1s
# 如果创建Thread时执行的函数,运行结束那么意味着这个子线程结束了....
def test2():
for i in range(10):
print("-----------test2---%d-----" % i)
time.sleep(1)
def main():
t1 = threading.Thread(target=test1) # 创建线程
t2 = threading.Thread(target=test2)
def test2():
for i in range(10):
print("-----------test2---%d-----" % i)
time.sleep(1)
def main():
t1 = threading.Thread(target=test1) # 创建线程
t2 = threading.Thread(target=test2)
t1.start() # 启动线程
t2.start()
while True:
print(threading.enumerate()) # 打印正在执行的线程数量
if len(threading.enumerate())<=1: # 判断线程数量是否小于等于1,等于1时说明只剩主线程
break
time.sleep(1)
if __name__ == "__main__":
main()
多线程之间共享全局变量,所以存在资源竞争问题
解决资源竞争问题:
互斥锁:
#创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock()
#上锁,如果之前没有上锁的,那么此时,上锁成功
#如果上锁之前 已经被上锁了,那么此时会堵塞在这里,直到这个锁被解开为止
mutex.acquire()
#需要被锁定的程序
#解锁
mutex.release()
死锁:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
如果要解决死锁问题,可以设置超时时间。