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