Python 复习笔记 多任务
多任务:
多任务就是可以让一台电脑同时执行多个命令,多个CPU一起执行
以前的单核cpu是怎么做到同时执行多个命令的?(时间片轮转)
——其实以前的单核CPU是让操作系统交替执行命令,每个任务执行0.01秒,这样看起来就像是在同时执行多个命令。就跟手翻动画一样。这就是并发
所以:并行是真的多任务;并发是假的多任务
线程:
使用:
1.创建对象 t1 = threading.Thread(target = sing) 应该把函数名sing给target,不能用sing(),sing()表示调用函数
2.创建线程 t1.start()
threading.enumerate() 用来获取当前所有的线程(得到的好像是对象)
线程的运行是没有先后顺序的,如果子线程没有延时,很快就执行完,那么当你调用时,获得的列表只有主线程
PS:在创建对象时 线程没有创建,当调用 xx.start() 时线程才创建并开始执行
知识点:
1.一个程序运行,一定有一个执行代码的东西,这个东西称作 《线程》
2.就像光标一行一行的往下移动,执行每一行代码,而多个线程,就会出现多个光标,分为主线程和子线程
3.当主线程执行完所有代码,就要等子线程,当子线程执行完,主线程才能结束(帮子线程处理垃圾)。只有主线程结束,程序才结束。不是程序结束,主线程才结束。
4.当调用的方法比较复杂时,可以把他封装成类,start会自动调用run方法,然后在run里面调用类里面的其他方法
xx.start()只创建了一个线程,执行 run() 如果里面有其他方法,在run()里调用
例子:
1 import time 2 import threading 3 4 class MyThread(threading.Thread): 5 def run(self): 6 self.sing() 7 self.dance() 8 9 def sing(self): 10 '''唱歌''' 11 for i in range(5): 12 print('正在唱歌') 13 time.sleep(1) 14 def dance(self): 15 '''跳舞''' 16 for i in range(5): 17 print('正在跳舞') 18 time.sleep(1) 19 20 def main(): 21 t = MyThread() 22 t.start() 23 24 if __name__ == '__main__': 25 main()
5.多线程的全局变量是共享的(03py),因为多线程一般是配合使用,如果不共享,那么就要等到一个线程执行完,再把变量传递给另一个线程,就变成单线程了
即:你在一个函数中设定变量x并加一,另一个函数打印变量x,当使用线程执行两个函数时,打印结果为加一后的变量
6.但是如果多个线程同时需要修改一个全局变量,就会出现资源竞争,如果变量X=1,两个函数都执行X+1
由于操作都要交给CPU执行,而CPU会让每个程序交替运行,导致全局变量还没存放进去,另一个线程又拿出来,于是另一个线程所拿出来的全局变量还没改变,导致变量只执行了一次 +1 所以全局变量是 2
所以这时就需要用到原子性操作(同步),要么做完,要么不做(概念 :同步就是协同步调,按预定的先后次序运行)
所以可以在创建对线的时候,把变量放进去
t1 = threading.Thread(target=test1,args=(num,)) # args = (记得是元组,如果只有一个数据就加逗号)
例子:
1 import threading 2 import time 3 4 def test1(temp): 5 temp.append(33) 6 print('__test1 %s' % str(temp)) 7 def test2(temp): 8 print('__test1 %s' % str(temp)) 9 10 num = [11,22] 11 def main(): 12 # target 指定将来这个线程要去执行哪个函数 13 # args 指定将来调用这个函数的时候,传递什么数据进去 14 t1 = threading.Thread(target=test1,args=(num,)) # args = (记得是元组如果只有一个就加逗号) 15 t2 = threading.Thread(target=test2,args=(num,)) 16 t1.start() 17 time.sleep(1) #保证test1先执行 18 t2.start() 19 print('__main %s'% num) 20 21 if __name__ == '__main__': 22 main()