zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    加速 MySQL 导入导出的方法
    Unix中shell脚本 中如何把变量截取
    HTTP POST GET 本质区别详解
    mysql replication 互为主从的安装及配置,以及数据同步
    linux bash shell之变量替换::=句法、=句法、:句法、句法、=?句法、?句法、:+句法、+句法
    bash下: () {} [] [[]] (())的解释
    linux shell 数组有关的一些知识
    Windows下XDebug 手工配置与使用说明
    上传图片并实现缩略图
    使用XmlWriter写XML文件
  • 原文地址:https://www.cnblogs.com/gsxl/p/12591067.html
Copyright © 2011-2022 走看看