zoukankan      html  css  js  c++  java
  • python记录_day33 线程

    ##进程就像加工厂,线程是里边的流水线
    ##进程是资源单位,线程是运行单位,每个进程至少有一个线程
    即进程是资源分配的最小单位,线程是CPU调度的最小单位

    一、线程的创建
    两种方式,和进程类似
    1、t = Thread(target = fun,arges = (,))
    2、自定义类 继承Thread,重写run方法
     1 import time
     2 from threading import Thread
     3 class Sayhi(Thread):
     4     def __init__(self,name):
     5         super().__init__()
     6         self.name=name
     7     def run(self):
     8         time.sleep(2)
     9         print('%s say hello' % self.name)
    10 
    11 
    12 if __name__ == '__main__':
    13     t = Sayhi('太白')
    14     t.start()
    15     print('主线程')
    方式二创建线程

    #常用方法

    t.join()  等待线程结束

    t.isAlive()   判断进程是否还活着

    current_thread().getName()     获取线程名

    current_thread().ident()     获取线程id

    threading.currentThread()      返回当前线程量

    threading.enumerate()       返回正在运行的线程列表

     二、数据共享

    同一进程中线程之间是数据共享的,这就会有数据安全问题,所以需要加锁

    三、死锁

    双方等待对方释放锁,所以都不能执行

    解决死锁方案:用递归锁RLock

      递归锁里有一个计数器,只有计数器为0时,别人才能抢。当有人抢到时就计数器+1,释放时计数器-1

    import time
    from threading import Thread, Lock, RLock
    
    
    def func1(lock_A, lock_B):
        with lock_A:
        # lock_A.acquire()
            time.sleep(0.1)
            print('alex拿到了A锁')
            # lock_B.acquire()
            with lock_B:
                print('alex拿到了B锁')
                # lock_B.release()
            # lock_A.release()
    
    
    def func2(lock_A, lock_B):
        with lock_B:
            # lock_B.acquire()
            print('taibai拿到了B锁')
            # lock_A.acquire()
            with lock_A:
                print('taibai 拿到了A锁')
    
            # lock_A.release()
            # lock_B.release()
    
    
    if __name__ == '__main__':
        lock_A = Lock()
        lock_B = Lock()
        lock_B = lock_A
    
        # lock_A =  RLock()
        # lock_B =  RLock()
        lock_A =lock_B =RLock()
    
        t1 = Thread(target=func1, args=(lock_A, lock_B))
        t2 = Thread(target=func2, args=(lock_A, lock_B))
        t1.start()
        t2.start()
    View Code

    四、守护线程

      正常情况下,主线程代码结束后会等待子线程结束,子线程都结束了主线程才会结束。但是,将子线程设为守护线程后,主线程就不再等他结束,所以守护线程随着主线程的结束而结束。

    #注意和守护进程的区别

    守护进程时随着主进程的代码结束而结束,主进程代码结束不意味着主进程的结束,(主进程代码结束后会等着子进程结束,给他们收尸)



  • 相关阅读:
    oracle递归层级查询 start with connect by prior
    C 常量指针和指针常量
    C 字符串常量和字符串变量定义和区别
    C 指针改变变量值
    UITableViewCell的高度与UILabel自适应
    手动开启ARC
    SWIFT模糊效果
    SWIFT中使用AFNetwroking访问网络数据
    MAC机中安装RUBY环境
    CocoaPods安装和使用教程
  • 原文地址:https://www.cnblogs.com/zhang-yl/p/10046808.html
Copyright © 2011-2022 走看看