在日常的工作中,经常会遇到优化代码效率的问题。简而言之就是需要降低代码巡行的时间,越少越好。今天就介绍个多线程的方式,运行时间蹭蹭蹭的往下降。

在python3中,我们使用threading模块来支持多线程。推荐一个国内较好的学习的网址,如下:threading --- 基于线程的并行 — Python 3.10.0 文档https://docs.python.org/zh-cn/3/library/threading.html

 使用多线程这个模块,最最简单的需要用到下面三个函数:

  • t1=threading.Thread(target=run,args=("t1",)) 创建一个线程实例
  • t1.start() 启动这个线程实例
  • t1.join() :等待,直到线程终结。不加join的话,主线程和子线程完全是并行的,加了join主线程得等这个子线程执行完毕,才能继续往下走。这样才能得到这个程序真正的运行时间。

其中:threading.Thread

class threading.Thread(group=None, target=None, name=None, 
                       args=(), kwargs={}, *, daemon=None)

调用这个构造函数时,必需带有关键字参数。参数如下:

  • group 应该为 None;为了日后扩展 ThreadGroup 类实现而保留。
  • target 是用于 run() 方法调用的可调用对象。默认是 None,表示不需要调用任何方法。(重点)
  • name 是线程名称。 在默认情况下,会以 "Thread-N" 的形式构造唯一名称,其中 N 为一个较小的十进制数值,或是 "Thread-N (target)" 的形式,其中 "target" 为 target.__name__,如果指定了 target 参数的话。
  • args 是用于调用目标a函数的参数元组。默认是 ()。(重点)
  • kwargs 是用于调用目标函数的关键字参数字典。默认是 {}

如果不是 Nonedaemon 参数将显式地设置该线程是否为守护模式。 如果是 None (默认值),线程将继承当前线程的守护模式属性。

如果子类型重载了构造函数,它一定要确保在做任何事前,先发起调用基类构造器(Thread.__init__())。

实例一:最简单的多线程

import threading,time
def run(n):
    print("task  ",n)
    time.sleep(2)

start_time=time.time()
t1=threading.Thread(target=run,args=("t1",))
t2=threading.Thread(target=run,args=("t2",))

t1.start()
t2.start()
t1.join()
t2.join()
print(time.time()-start_time)

打印结果:

task   t1
task   t2
2.0011146068573

 观察实验结果,我们得到原本需要4s左右的执行时间变成了2秒,证明了多线程的高效率。参考文章:python之多线程 - 简书进程的概念:以一个整体的形式暴露给操作系统管理,里面包含各种资源的调用。 对各种资源管理的集合就可以称为进程。线程的概念:是操作系统能够进行运算调度的最小单位。本质上就是一串...https://www.jianshu.com/p/a4aedd66af7c

实例二:获取threading多线程的return返回值

import threading, time

# 定义一个MyThread.py线程类
class MyThread(threading.Thread):
    def __init__(self, func, args=()):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args
    def run(self):
        self.result = self.func(*self.args)
    def get_result(self):
        threading.Thread.join(self)  # 等待线程执行完毕
        try:
            return self.result
        except Exception:
            return None

def run(n):
    print("task  ",n)
    time.sleep(2)
    return "task  "+n

start_time=time.time()
t1 = MyThread(func=run, args=("t1",))
t2 = MyThread(func=run, args=("t2",))

t1.start()
t2.start()
t1.join()
t2.join()
print(time.time()-start_time)
print(t1.get_result())
print(t2.get_result())

 打印结果:

task   t1
task   t2
2.0050857067108154
task  t1
task  t2

参考内容:python获取threading多线程的return返回值