多线程编程(六) 单线程和多线程对比

作者: 全栈coder | 来源:发表于2018-01-24 11:01 被阅读143次


    首先我们建立一个名为 myThread 的独立模块,以便在接下来的例子中导入这个类。除了简单的调用函数之外,还将把结果保存在实例属性 self.res中,并创建一个新的方法 getResult() 来获取这个值。

    import threading
    from time import sleep, ctime
    
    class MyThread(threading.Thread):
    
        def __init__(self, func, args, name=''):
            threading.Thread.__init__(self)
            self.name = name
            self.func = func
            self.args = args
    
        def getResult(self):
            return self.res
        
        def run(self):
            print('start loop %s at:%s' % (self.name, ctime()))
            self.res = self.func(*self.args)
            print(' %s finished at:%s' % (self.name, ctime()))
    

    下面代码将比较递归求斐波那契,阶乘与累加函数的执行。该脚本按照单线程的方式运行这三个函数。之后使用多线程方式执行同样的任务,用来说明多线程的优点。

    from myThread import MyThread
    from time import ctime, sleep
    
    def fib(x):
        sleep(0.005)
        if x < 2:
            return 1
        return (fib(x-2) + fib(x-1))
    
    def fac(x):
        sleep(0.1)
        if x < 2:
            return 1
        return (x * fac(x-1))
    
    def sum(x):
        sleep(0.1)
        if x < 2:
            return 1
        return (x + sum(x-1))
    
    funcs = [fib, fac, sum]
    n = 12
    
    def main():
        nfuncs = range(len(funcs))
    
        print('*******单线程*******')
        for i in nfuncs:
            print('start  %s at:%s' % (funcs[i].__name__, ctime()))
            print(funcs[i](n))
            print('%s finished at:%s' % (funcs[i].__name__, ctime()))
    
        print('\n*******多线程*******')
        threads = []
        for i in nfuncs:
            t = MyThread(funcs[i],(n,), funcs[i].__name__)
            threads.append(t)
    
        for i in nfuncs:
            threads[i].start()
    
        for i in nfuncs:
            threads[i].join()
            print(threads[i].getResult())
    
        print('执行结束')
    
    if __name__ == '__main__':
        main()
    

    以单线程模式运行时,只是简单的一次调用每个函数,并在函数执行结束后立即返回相应的结果。
    而以多线程模式运行时,并不会立即显示结果。因为我们希望让 MyThread 类越通用越好(有输出和没有输出的调用都能执行),我们要一直等待所有的线程都执行完毕,然后调用 getResult() 方法来最终显示每个函数的返回值。

    因为这些函数执行起来都非常快,所以你会发现在每个函数中都加入了sleep()调用,用于减慢执行速度,一边让我们看到多线程是如何改善性能的。在实际的工作中,如果确实有不同的执行时间,你肯定不会在其中调用sleep()函数。无论如何,下面是执行的结果。

    *******单线程*******
    start  fib at:Wed Jan 24 12:03:40 2018
    233
    fib finished at:Wed Jan 24 12:03:43 2018
    start  fac at:Wed Jan 24 12:03:43 2018
    479001600
    fac finished at:Wed Jan 24 12:03:44 2018
    start  sum at:Wed Jan 24 12:03:44 2018
    78
    sum finished at:Wed Jan 24 12:03:45 2018
    
    *******多线程*******
    start loop fib at:Wed Jan 24 12:03:45 2018
    start loop fac at:Wed Jan 24 12:03:45 2018
    start loop sum at:Wed Jan 24 12:03:45 2018
     sum finished at:Wed Jan 24 12:03:46 2018
     fac finished at:Wed Jan 24 12:03:46 2018
     fib finished at:Wed Jan 24 12:03:47 2018
    233
    479001600
    78
    执行结束
    

    相关文章

      网友评论

        本文标题:多线程编程(六) 单线程和多线程对比

        本文链接:https://www.haomeiwen.com/subject/uhefaxtx.html