在日常的工作中,经常会遇到优化代码效率的问题。简而言之就是需要降低代码巡行的时间,越少越好。今天就介绍个多线程的方式,运行时间蹭蹭蹭的往下降。
在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 是用于调用目标函数的关键字参数字典。默认是
{}
。
如果不是 None
,daemon 参数将显式地设置该线程是否为守护模式。 如果是 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返回值