zoukankan      html  css  js  c++  java
  • 多线程

    多线程

    基于并发编程

    进程的定义:是操作系统可以调度已经进行资源分配的基本单位,是一个资源单位,其中包含了运行这个程序所需的资源

    线程的定义:是操作系统可以运算调度的最小单位,是真正的执行单位,其包含在进程当中,一个线程就是一条固定的控制流程

    两者的关系:进程可以包含多个线程,同一进程中的线程共享进程内的资源

    特点:系统会为每个进程自动创建一条线程,称之为主线程,后续通过代码开启的线程称之为子线程

    对照表:

    进程 线程
    进程是一个资源单位 是一个执行单位
    创建开销——————> 创建开销
    多个进程之间是相互隔离的 线程之间是共享进程内的所有资源的
    进程对于硬件资源是竞争关系 线程是协作关系,-->流水线上的员工
    开启进程消耗的资源很大(1000就奔溃) 开启非常快
    进程之间的有层级关系 线程是平等的
    进程好比作车间 线程好比做流水线

    为什么要用线程直接用进程岂不是就可以

    1:有多个任务要并发处理

    2:当要并发处理的让你无有很多时,不能使用进程,进程资源开销太大,线程开销资源很小,适合用于非常多的情况

    线程的使用

    方式一:直接实例化Thread类

    from threading import Thread
    def task():
        print('子线程 run')
    与进程的不同之处: 不需要加判断+开启线程的代码放哪里都可以
    t=Thread(target=task)
    t.start()
    print('over')
    

    方法二:继承Thread类

    class Mythread(Thread):
        def run(self):
            #把在子线程中的执行代码放入run中
            print('zi run')
            
    mt =Mythread()
    me.start()
    print('over')
    
    

    线程的安全问题

    只要并发了访问同一资源一定会产生安全问题,解决方案和多进程一致,就是给操作公共资源代码加锁就完事

    from threading import Lock,Thread
    import time
    a=10
    
    l=Lock()
    
    def task():
        global a
        l.acquire()
        temp=a
        time.sleep(0.2)
        a=temp-1
        l.release()
        
        
    lis=[]
    for i in range(10):
        t=Thread(targer=task)
        t.start()
        lis.append(t)
        
     for t in lis:
        t.join()
        
     print('a')
    

    守护进程

    一个线程a 设置为b的守护线程,a会随着b的结束而结束

    默认的情况下,主线程即使代码执行完毕,也会等待所有非守护线程完毕后程序才能结束,因为多个线程之间是协作关系

    from threading import Thread
    import time
    
    def task():
        print('妃子  start')
        time.sleep(5)
        print('妃子  over')
        
    def task2():
        print('皇后   start')
        time.sleep(5)
        print('皇后   over')
        
    print('主 satrt')
    
    t=Thred(target=task)
    t.daemon() =True
    t.start()
    
    
    t2= Thread(target=task)
    t2.start()
    
    print('主  over')
    
    打印结果:
    主  start
    妃子 start
    皇后 start
    主 over
    皇后 over
    
    

    线程中的常用属性和方法

    from threading import Thread,currentThread,enumerate,activecount
    import time
    """
    t=Thread()
    t=start()
    t.join()
    t.is_alive()
    t.isAlive()
    t.ident     #线程的标志符
    t.daemon()
    
    
    获取当前线程的对象
    print(currentThread())
    t=Thread(target=lambda:print(currentThread()))
    t.start()
    """
    
    t=Thread(taeget=lambda:time.sleep(1))
    t.start()
    
    t=Thread(target=lambda:time.sleep(1))
    t.start()
    t.join()
    
    
    #获取正在运行的所有线程对象,是一个列表
    print(enumerate())
    
    
    #存活的线程数量
    print(activeCount())
    
  • 相关阅读:
    Python3 tkinter基础 Canvas create_text 在画布上添加文字
    js中如何返回一个存放对象的数组?
    vs2015 出现Lc.exe 已退出,代码为-1的问题,如何解决
    微信PC客户端无法发送图片,怎么解决?
    vs2015 编译时项目出现NuGet程序包还原失败,找不到xxx.xxx.xxx版本的程序包,怎么解决这个问题?
    sql server 根据身份证号计算出生日期和年龄的存储过程
    sql server中截取字符串的常用函数
    sql server 中进行除法运算时,如何得到结果是小数形式呢?
    sql中,如何获取一个数的整数部分和余数部分
    sql 中,如何获取两个日期之前月数、周数、天数
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11134476.html
Copyright © 2011-2022 走看看