• doraemon的python 线程详解


    ### 9.3 线程(开销小)
    
    - 线程是进程中的一部分,每一个进程至少有一个线程
    - 进程是计算机最小的资源分配单位(进程是负责圈资源)
    - 线程是计算机中能被CPU调度最小单位(线程是负责执行具体代码)
    - 比较:
      - 进程:数据隔离 开销大 是一个资源分配单位
      - 线程:数据共享 开销小 是进程的一部分
    
    #### 9.3.1 GIL 全局解释器锁
    
    GIL锁:
    
    - 保证了整个python程序中,只有一个线程被CPU执行
    - 原因:cpython解释器中的特殊垃圾回收机制
    - GIL锁导致了线程不能并行,可以并发
    
    但是使用线程并不会影响高IO型的操作,只会对高计算型的成语有效率上的影响
    
    #### 9.3.2 Thread模块
    
    multiprocessing是完全房展threading的类写的,使用方法基本一样
    
    ```python
    #单个子线程
    from threading import Thread
    
    def func():
        print('liujia')
        
    Thread(target=func).start()
    
    ```
    
    ```python
    #多个子线程
    import os
    import time
    from threading import Thread
    
    def func(i):
        print('start son thread',i)
        time.sleep(0.2)
        print('end',os.getpid())
        
    for i in range(10):
        Thread(target=func,args=(i,)).start()
    print('main')
    ```
    
    ```python
    #join方法 阻塞 知道子进程执行结束
    def func(i):
        print('start son thread',i)
        time.sleep(0.2)
        print('end',os.getpid())
        
    t_l = []
    for i in range(10):
        t = Thread(target=func,args=(i,))
        t.start()
        t_l.append(t)
    for t in t_l:t.join()
    print('子线程执行完毕')
        
    ```
    
    ```python
    #面向对象启动线程
    class MyThread(Thread):
        def __init__(self,i):
            self.i = i
            super().__init__()
        def run(self):
            print('start',self.i,self.ident)
            time.sleep(1)
            print('end',self.i)
    
    for i in range(10):
        t = MyThread(i)
        t.start()
        print(t.ident)
    ```
    
    ```python
    #线程里的一些其他方法
    from threading import current_thread,enumerate,active_count
    def func(i):
        t = current_thread()
        print('start son thread',i,t.ident)
        time.sleep(1)
        print('end son thread',i,os.getpid())
    
    t = Thread(target=func,args=(1,))
    t.start()
    print(t.ident)
    print(current_thread().ident)   # 水性杨花 在哪一个线程里,current_thread()得到的就是这个当前线程的信息
    print(enumerate())
    print(active_count())   # =====len(enumerate())
    ```
    
    注意:
    
    - 守护线程一直等到所有非守护线程结束才会结束
    - 除了守护了主线程的代码之外也会守护子线程
  • 相关阅读:
    python isinstance函数 判断元素是否是字符串、int型、float型
    Day04 list(列表)
    Day 05 Dict字典
    Python的简介
    DAY7 字符编码和文件操作
    DAY6 元组、字典与集合
    DAY5 基本数据类型及内置方法
    DAY4 if、while和for
    DAY3 数据类型与运算符
    DAY2 初识python
  • 原文地址:https://www.cnblogs.com/doraemon548542/p/11427302.html
Copyright © 2020-2023  润新知