多任务多线程

多任务概念

如果在单核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,结果两个线程都不执行相互等待.可以利用银行家算法.或者设置等待时间来解决这一问题.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值