多任务概念
如果在单核cup的电脑上同时运行多个程序.他是怎么做到的?
假如有4个程序在运行,那么cup把每个程序执行0.1秒,然后换下一个程序,运行速度实在是太快了.所以我们看到,好像多个任务在同时执行.这种策略就叫做时间片轮转
同时在这里引发并行和并发
当cpu核数大于任务数时,不需要循环调度去运行.所有的任务是真正的在肩并肩运行,也就是并行
当cpu核数小于任务数,需要来轮流运行,看似是同时执行,但并不是真正的同时,就叫做并发
import time
def sing():
for i in range(5):
print('---正在唱歌')
time.sleep(1)
def dance():
for i in range(5):
print('---正在跳舞')
time.sleep(1)
if __name__ == '__main__':
sing()
dance()
>>>---正在唱歌
>>>---正在唱歌
>>>---正在唱歌
>>>---正在唱歌
>>>---正在唱歌
>>>---正在跳舞
>>>---正在跳舞
>>>---正在跳舞
>>>---正在跳舞
>>>---正在跳舞
#调用threading模块
import threading
def sing():
for i in range(5):
print('---正在唱歌')
time.sleep(1)
def dance():
for i in range(5):
print('---正在跳舞')
time.sleep(1)
def main():
# threading (则ruai丁)
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
if __name__ == '__main__':
main()
>>>---正在唱歌
>>>---正在跳舞
>>>---正在唱歌
>>>---正在跳舞
>>>---正在唱歌
>>>---正在跳舞
>>>---正在唱歌
>>>---正在跳舞
>>>---正在唱歌
>>>---正在跳舞
多线程
线程的运行是无序的
主线程结束程序结束运行,子线程依赖主线程
默认主线程会等待全部子线程运行结束,主线程才会结束
import time
import threading
def sing():
#不设置等待时间,可能在主线程运行打印之前,子线程就运行,完毕.所有要设置等待时间
time.sleep(1)
for i in range(3):
print('---正在唱歌')
def dance():
time.sleep(1)
for i in range(3):
print('---正在跳舞')
def main():
# 当调用Thread时不会创建线程
# 当调用Thread创建出来的实例对象的start方法时创建子线程
# Thread创建时target指定函数名,同时也可以用args传递参数,但参数必须是元祖 args=(list,)
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
# 主线程运行到此,调用另一个函数派生子线程
t1.start()
# 再次派生子线程
t2.start()
# enumerate(enu么瑞特)打印线程数量
print(len(threading.enumerate()))
if __name__ == '__main__':
#当程序执行就是生成一条主线程
main()
>>>3
互斥锁
当多个线程对同一个对象进行操作时,会造成资源的恶意竞争,导致结果可能出现混乱.所以需要加互斥锁来限制.避免结果出现混乱.
但要注意死锁.A等B,B等A,结果两个线程都不执行相互等待.可以利用银行家算法.或者设置等待时间来解决这一问题.