threading库的简单使用
在使用python编程的过程中,经常会遇到一些需要使用到多线程的问题,可能是为了提高程序的运行效率,但是,更常见的是在编写界面程序的时候,有时由于我们的方法过于复杂而导致运行慢,经常出现界面卡顿甚至是函数未能正常运行的情况。这个时候,往往使用多线程可以解决类似问题。这里讲一下我自己在粗浅使用threading库时的一些心得。
(PS: 学习过程中多有借鉴大神,致敬)
import time
from threading import Thread
一、函数无需参数、无需返回值的情况
在使用threading库的过程中,比较常见的情况是重构一下Thread类。将我们需要进行多线程运行的函数作为参数,实例我们构造的类,然后使其开始运行,上代码:
class MyThread(Thread):
def __init__(self, func):
super().__init__()
self.func = func
def run(self):
self.func()
这种方法的优点在于,我们可以对run()方法重写,比较灵活;但是实际上,也可以通过直接调用Thread类进行实例。
使用案例
通过MyThread类:
thread1 = MyThread(self.func)
thread1.start()
直接通过Thread类:
thread1 = Thread(self.func)
thread1.start()
二、需要参数和返回值的情况
和上面基本相同,思路也是重构Thread类,只不过需要参数和返回值的情况,在重构的过程中,不仅需要重构run()方法,还需要写一个get_result()方法,代码如下:
class MyThread(threading.Thread):
def __init__(self, func, *args, **kwargs):
super(MyThread, self).__init__()
self.func = func
self.args = args
self.kwargs = kwargs
def run(self):
self.result = self.func(*self.args, **self.kwargs)
def get_result(self):
try:
return self.result
except Exception as e:
return None
使用案例
def a(a, l=1):
time.sleep(0.5)
return a+l
s = time.time()
thread1 = MyThread(a, 1, l=2)
thread1.start()
print(time.time() - s)
while thread1.get_result() is None:
thread1.get_result()
print(thread1.get_result())
运行效果:
0.0009975433349609375
3
通过这种方式,可以将我们传入多线程的程序的运行结果送出,但是据我一位"老师"所说,这种方式算是野路子,因为,送入多线程的程序,一般情况下不要求传出返回值。
总结
对于Thread的使用,由于个人不是科班出身,对于这个库的理解十分有限,使用上,多参考网上大神的用法,可能有部分理解不到位,望指出。谢谢各路大神~