• python-46-多线程


    前言

    线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位,代码/数据/文件是共享的。

    就好像看作一个进程中还有多个线程执行任务,简单点来说就是一个程序运行中有多个线程在执行。

    一、初识多线程

    1、函数中多线程:

    # 初识多线程:threading
    from threading import Thread
    import time
    def func(i):
        time.sleep(2)
        print(i)
    
    if __name__ == '__main__':
        for i in range(5):
            thread=Thread(target=func,args=(i,))
            thread.start()

     2、类中多线程:

    # 2、类中多线程
    from threading import Thread
    import time
    class MyTread(Thread):
        def __init__(self,i):
            super().__init__()
            self.i=i
        def run(self):          # 必须有run方法
            time.sleep(1)
            print(self.i)
    
    for i in range(10):
        t=MyTread(i)
        t.start()

    线程pid是一样的:

     3、代码/数据/文件是共享的:

     但变量计算中会可能会同时拿到变量导致数据不安全,但可以加锁(GIL锁)

     实例:

    # 3、代码/数据/文件是共享的实例
    from threading import Thread
    import time
    num=10                      # 定义一个全局变量
    class MyTread(Thread):
        def __init__(self,i):
            super().__init__()
            self.i=i
        def run(self):          # 必须有run方法
            global num          # global声明变量
            time.sleep(1)
            print('线程:',self.i+num) # i+num
    for i in range(10):
        t=MyTread(i)
        t.start()

    4、多线程与多进程效率对比,同是100个。

    明显多线程更胜一筹,毋庸置疑。

    # 4、多线程与多进程效率对比,同是100个。
    from threading import Thread
    import time
    from multiprocessing import Process
    def func(i):
        return i+i
    if __name__ == '__main__':
        start=time.time()
        t_lst=[]
        for i in range(100):
            t=Thread(target=func,args=(i,))     # 多线程
            t.start()
            t_lst.append(t)
        for i in t_lst:i.join()
        t1=time.time()-start
        print('多线程执行时间:',t1)
    
        start=time.time()
        p_lst=[]
        for i in range(100):
            p=Process(target=func,args=(i,))    # 多进程
            p.start()
            t_lst.append(p)
        for i in p_lst:i.join()
        t2=time.time()-start
        print('多进程执行时间:',t2)

     二、threading 其它方法

    • current_thread:查看线程名字与id
    • get_ident:查看线程id
    • active_count:查看活跃线程数(注意要加上主线程)
    • enumerate:查看线程所有项(len就得到活跃线程数)

    1、threading模块其它方法:

    # threading模块其它方法
    import threading,time
    def func(i):
        time.sleep(0.5)
        print(i,threading.current_thread())     # 查看线程名字与id
        print(i,threading.get_ident())          # 查看线程id
    
    for i in range(5):
        threading.Thread(target=func,args=(i,)).start()
    print(threading.active_count())             # 查看活跃线程数(注意要加上主线程)
    print(threading.enumerate())                # 查看线程所有项
    print(threading.current_thread())           # 查看线程名字与id

    小结:

    • 进程是最小的内存分配单位,线程是操作系统调度的最小单位
    • 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程
    • 开启一个线程所需要的时间要远远小于开启一个进程
    • 多个线程内部有自己的数据栈,数据不共享,但代码/数据/文件是共享的
    • 全局变量在多个线程之间是共享的,但会导致数据不安全,需加锁

    欢迎来大家QQ交流群一起学习:482713805

  • 相关阅读:
    PS 修复画笔
    PS 魔棒工具、仿制图章
    PS选区的应用
    PS界面介绍
    火狐浏览器任务栏设置默认 隐私模式开启
    [CSS] Using inline-grid to gain easy control over gap and size
    [AWS] Presign url for S3
    [CSS] Customer focus / disabled style for select element
    [CSS] Using single grid-template-area and justify-self to select arrow down icon in select
    [CSS 3] Using CSS attribute selector
  • 原文地址:https://www.cnblogs.com/gsxl/p/12591067.html
Copyright © 2020-2023  润新知