知行编程网知行编程网  2022-09-04 01:30 知行编程网 隐藏边栏  5 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python如何使用多线程的相关知识,包括多线程 python,以及python多线程request这些编程知识,希望对大家有参考作用。

python如何使用多线程

多线程(英文:multithreading)是指从软件或硬件上实现多线程并发执行的技术。具有多线程功能的计算机具有硬件支持,可以一次执行多个线程,从而提高整体处理性能。具有此功能的系统包括对称多处理器、多核处理器和芯片级多线程或同时多线程处理器。在一个程序中,这些独立运行的程序段称为“线程”(Thread),使用它进行编程的概念称为“多线程(Multithreading)”。一台具有多线程能力的计算机,由于硬件支持,可以同时执行多个线程(台湾翻译为“线程”),从而提高整体处理性能。


Python 多线程之使用方法

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

- _thread

- threading

- Queue

- multiprocessing

下面一一介绍:

1. _thread 模块提供底层基础函数来支持多线程功能,并提供简单的锁来保证同步。推荐使用线程模块。

2、threading模块封装了_thread,提供了更高级、更强大、更易用的线程管理功能,对线程的支持更完善。在大多数情况下,只需要高级线程。模块就足够了。


使用 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")}')

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

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享