python之threading多线程的简单使用

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的使用,由于个人不是科班出身,对于这个库的理解十分有限,使用上,多参考网上大神的用法,可能有部分理解不到位,望指出。谢谢各路大神~

发布了8 篇原创文章 · 获赞 19 · 访问量 550

猜你喜欢

转载自blog.csdn.net/evil126126/article/details/105608154