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


  • 背景/简介
  • 线程和进程
  • 线程和Python
  • thread 模块
  • threading模块
  • 单线程和多线程对比
  • 多线程实践
  • 生产者-消费者问题和Queue/queue 模块
  • 线程的替代方案

首先我们建立一个名为 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
执行结束

你可能感兴趣的:(多线程编程(六) 单线程和多线程对比)