最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python如何使用多线程

    正文概述    2020-02-22   259

    python如何使用多线程

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

    Python 多线程之使用方法

    Python 提供多线程编程的模块有以下几个:

    - _thread

    - threading

    - Queue

    - multiprocessing

    下面一一介绍:

    1. _thread 模块提供了低级别的基本功能来支持多线程功能,提供简单的锁来确保同步,推荐使用 threading 模块。

    2. threading 模块对 _thread 进行了封装,提供了更高级别,功能更强,更易于使用的线程管理的功能,对线程的支持更为完善,绝大多数情况下,只需要使用 threading 这个高级模块就够了。

    相关推荐:《Python教程》

    使用 threading 进行多线程操作:

    方法一:是创建 threading.Thread 实例,调用其 start() 方法。

    import time
    import threading
    def task_thread(counter):
        print(f'线程名称:{threading.current_thread().name} 参数:{counter} 开始时间:{time.strftime("%Y-%m-%d 
        %H:%M:%S")}')
        num = counter
        while num:
            time.sleep(3)
            num -= 1
        print(f'线程名称:{threading.current_thread().name} 参数:{counter} 结束时间:{time.strftime("%Y-%m-%d 
        %H:%M:%S")}')
    if __name__ == '__main__':
        print(f'主线程开始时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
        #初始化3个线程,传递不同的参数
        t1 = threading.Thread(target=task_thread, args=(3,))
        t2 = threading.Thread(target=task_thread, args=(2,))
        t3 = threading.Thread(target=task_thread, args=(1,))
        #开启三个线程
        t1.start()
        t2.start()
        t3.start()
        #等待运行结束
        t1.join()
        t2.join()
        t3.join()
        print(f'主线程结束时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

    运行结果如下所示:

    主线程开始时间:2018-07-06 23:03:46
    线程名称:Thread-1 参数:3 开始时间:2018-07-06 23:03:46
    线程名称:Thread-2 参数:2 开始时间:2018-07-06 23:03:46
    线程名称:Thread-3 参数:1 开始时间:2018-07-06 23:03:46
    线程名称:Thread-3 参数:1 结束时间:2018-07-06 23:03:49
    线程名称:Thread-2 参数:2 结束时间:2018-07-06 23:03:52
    线程名称:Thread-1 参数:3 结束时间:2018-07-06 23:03:55
    主线程结束时间:2018-07-06 23:03:55

    方法二:继承 Thread 类,在子类中重写 run() 和 init() 方法。

    import time
    import threading
    class MyThread(threading.Thread):
        def __init__(self, counter):
            super().__init__()
            self.counter = counter
        def run(self):
            print(
                f'线程名称:{threading.current_thread().name} 参数:{self.counter} 开始时间:{time.strftime
                ("%Y-%m-%d %H:%M:%S")}'
            )
            counter = self.counter
            while counter:
                time.sleep(3)
                counter -= 1
            print(
                f'线程名称:{threading.current_thread().name} 参数:{self.counter} 结束时间:{time.strftime
                ("%Y-%m-%d %H:%M:%S")}'
            )
    if __name__ == "__main__":
        print(f'主线程开始时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
        # 初始化3个线程,传递不同的参数
        t1 = MyThread(3)
        t2 = MyThread(2)
        t3 = MyThread(1)
        # 开启三个线程
        t1.start()
        t2.start()
        t3.start()
        # 等待运行结束
        t1.join()
        t2.join()
        t3.join()
        print(f'主线程结束时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

    运行结果如下,与方法一的运行结果一致。

    主线程开始时间:2018-07-06 23:34:16
    线程名称:Thread-1 参数:3 开始时间:2018-07-06 23:34:16
    线程名称:Thread-2 参数:2 开始时间:2018-07-06 23:34:16
    线程名称:Thread-3 参数:1 开始时间:2018-07-06 23:34:16
    线程名称:Thread-3 参数:1 结束时间:2018-07-06 23:34:19
    线程名称:Thread-2 参数:2 结束时间:2018-07-06 23:34:22
    线程名称:Thread-1 参数:3 结束时间:2018-07-06 23:34:25
    主线程结束时间:2018-07-06 23:34:25

    如果继承 Thread 类,想调用外部传入函数,代码如下所示:

    import time
    import threading
    def task_thread(counter):
          print(f'线程名称:{threading.current_thread().name} 参数:{counter} 开始时间:{time.strftime("%Y-%m-%d 
          %H:%M:%S")}')
        num = counter
        while num:
            time.sleep(3)
            num -= 1
        print(f'线程名称:{threading.current_thread().name} 参数:{counter} 结束时间:{time.strftime("%Y-%m-%d 
        %H:%M:%S")}')
    class MyThread(threading.Thread):
        def __init__(self, target, args):
            super().__init__()
            self.target = target
            self.args = args
        def run(self):
            self.target(*self.args)
    if __name__ == "__main__":
        print(f'主线程开始时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
        # 初始化3个线程,传递不同的参数
        t1 = MyThread(target=task_thread,args=(3,))
        t2 = MyThread(target=task_thread,args=(2,))
        t3 = MyThread(target=task_thread,args=(1,))
        # 开启三个线程
        t1.start()
        t2.start()
        t3.start()
        # 等待运行结束
        t1.join()
        t2.join()
        t3.join()
        print(f'主线程结束时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

    这样就和方法一是相通的,实例化自定义的线程类,运行结果不变。


    起源地下载网 » python如何使用多线程

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元