以用户为中心 建设学校网站,至少保存十个以上域名网站,wordpress 自定义导航,网络服务遇到问题请稍后再试吧文章目录一、多任务是什么#xff1f;二、多任务-线程四、通过继承Tread类完成创建线程五、资源竞争六、同步与互斥锁七、对峙与避免死锁一、多任务是什么#xff1f;
多个函数同时执行一件事情就是多任务#xff0c;没有多任务的时候任务执行都是按照顺序的#xff0c;而…
文章目录一、多任务是什么二、多任务-线程四、通过继承Tread类完成创建线程五、资源竞争六、同步与互斥锁七、对峙与避免死锁一、多任务是什么
多个函数同时执行一件事情就是多任务没有多任务的时候任务执行都是按照顺序的而多任务的时候任务执行可以是同时的; 并行真的多任务 并发假的多任务
二、多任务-线程
import time
import threading
def sing():唱歌5秒for i in range(5):print(------正在唱歌------)time.sleep(1)
def dance():跳舞5秒for i in range(5):print(------正在跳舞------)time.sleep(1)
def main():t1threading.Thread(targetsing)t2threading.Thread(targetdance)t1.start()t2.start()
if __name__ __main__:main()import threading
def text1():for i in range(5):print(-----test1----%d----%i)
def text2():for i in range(5):print(-----test2----%d----%i)#因为线程执行的过程中没有slip延时所以先谁后谁看cpu心情
def main():t1threading.Thread(targettext1)t2 threading.Thread(targettext2)t1.start()t2.start()print(threading.enumerate())
if __name__ __main__:main()import threading
import timedef text1():for i in range(5):print(-----test1----%d----%i)
def text2():for i in range(5):print(-----test2----%d----%i)#因为线程执行的过程中没有slip延时所以先谁后谁看cpu心情
def main():t1threading.Thread(targettext1)t2 threading.Thread(targettext2)t1.start()time.sleep(1)#休眠延时t2.start()time.sleep(1) # 休眠延时print(threading.enumerate())
if __name__ __main__:main()import threading
import time
def text1():for i in range(5):print(------text1------------%d----%i)time.sleep(1)
#如果创建thread时执行的函数结束则意味着这个线程结束了
def text2():for i in range(10):print(-------text2-----------%d----%i)time.sleep(1)
def main():t1threading.Thread(targettext1)t2threading.Thread(targettext2)t1.start()#只有在运行时才建立线程并且线程运行t2.start()while True:print(threading.enumerate)#threading.enumerate查看当前线程信息#enumerate返回值是一个元组thread_num len(threading.enumerate())print(线程数量是%d % thread_num)if thread_num1:#当只剩一个主线程的时候则退出,主线程结束则全线程结束故而主线程要等到最后保证其他线程执行完成breaktime.sleep(1)
if __name____main__:main()#主线程最后退出还有一层作用就是清理各线程留下的垃圾四、通过继承Tread类完成创建线程
import threading
import time
class Mythread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msgImself.namestr(i)#name属性中保存的是当前线程的名字print(msg)
if __name____main__:tMythread()#调用类做线程的方法适合于一个线程里面做的东西比较复杂而且分成了很多个函数来做#这里创建了一个实例对象意味着只能创建一个线程一个线程同一时间只能执行一个函数t.start()#在类里面自动调用run方法并且只能调用run如果下面还有其他方法可以在run方法内部用语句调用不可以用“t.其他方法()”五、资源竞争
多个线程之间是共享全局变量的但是这里有个问题如果一个线程写一个线程读则不会出问题但是两个线程都去写就会出现问题资源竞争
#定义一个全局变量
import threading
import timeg_num100
def test1():global g_numg_num1print(-------in test1 g_num%d-----%g_num)
def test2():print(-------in test2 g_num%d-----%g_num)
def main():t1threading.Thread(targettest1)t2threading.Thread(targettest2)t1.start()time.sleep(1)t2.start()time.sleep(1)print(------in main Thread g_num%d-----%g_num)
if __name____main__:main()#定义一个全局变量
import threading
import timedef test1(temp):temp.append(33)print(-------in test1 temp%s-----%str(temp))
def test2(temp):print(-------in test2 temp%s-----%str(temp))
g_num[11,22]
def main():t1threading.Thread(targettest1,args(g_num,))#args里面一定是一个元组所以一定要写逗号t2threading.Thread(targettest2,args(g_num,))t1.start()time.sleep(1)t2.start()time.sleep(1)print(------in main Thread g_num%s-----%str(g_num))
if __name____main__:main()六、同步与互斥锁
同步概念、互斥锁解决资源竞争问题要么不做要么做完同步就是协同步调按预定的先后次序运行怎么做互斥锁当多个线程几乎同时修改某一个共享数据的时候需要进行同步控制线程同步能够保证多个线程安全访问的竞争资源最简单的同步机制是引入互斥锁某个线程要更改共享数据时先将其锁定此时资源的状态为锁定其他线程不能更改直到该线程释放资源将资源的状态变成”非锁定“其他的线程才能再次锁定该资源互斥锁保证了每次只有一个线程进行写入操作从而保证了多线程情况下数据的正确性。 #互斥锁创建mutexthreading.Lock() #锁定mutex.acquire() #释放mutex.release()
#定义一个全局变量
import threading
import time
g_num0
def test1(num):global g_num#上锁如果之前没有被上锁那么此时上锁成功#如果上锁之前已经被上锁那么此时会堵塞在这里直到这个锁被解开mutex.acquire()for i in range(num):g_num1#解锁mutex.release()print(-----in test1 g_num%d----%g_num)def test2(num):global g_nummutex.acquire()for i in range(num):g_num1mutex.release()print(-----in test2 g_num%d----%g_num)
#创建一个互斥锁默认是没有上锁的
mutexthreading.Lock()def main():t1threading.Thread(targettest1,args(100,))#args里面一定是一个元组所以一定要写逗号t2threading.Thread(targettest2,args(100,))t1.start()t2.start()time.sleep(3)if __name____main__:main()#定义一个全局变量
import threading
import time
g_num0
def test1(num):global g_numfor i in range(num):mutex.acquire()g_num1mutex.release()print(-----in test1 g_num%d----%g_num)def test2(num):global g_numfor i in range(num):mutex.acquire()g_num1mutex.release()print(-----in test2 g_num%d----%g_num)
#创建一个互斥锁默认是没有上锁的
mutexthreading.Lock()def main():t1threading.Thread(targettest1,args(100,))#args里面一定是一个元组所以一定要写逗号t2threading.Thread(targettest2,args(100,))t1.start()t2.start()time.sleep(3)if __name____main__:main()七、对峙与避免死锁
当多个线程同时遇到死锁问题时可能产生对峙现象为了避免死锁有两种解决方法1、程序设计时尽量避免银行家算法2、添加超时时间等 银行家算法:
设Request(i)是进程Pi的请求向量如果Request(i)[j]k表示进程Pi需要K个R(j)类型的资源。当Pi发现资源请求后系统将进行下列步骤
(1)如果Request(i)[j] Need[i,j],边转向步骤2),否则认为出错因为它所请求的资源数已超过它所宣布的最大值。
(2)如果Request(i)[j] Available[i,j]便转向步骤3)否则表示尚无足够资源Pi需等待。
(3)系统试探着把资源分配给进程Pi并需要修改下面数据结构中的数值
Available[j] Available[j] - Request(i)[j];
Allocation[i,j] Allocation[i,j] Request(i)[j];
Need[i,j] Need[i,j] - Request(i)[j];