zoukankan      html  css  js  c++  java
  • 分别用单线程和多线程运行斐波那契、阶乘和累加和

    threading 的Thread类是用来创建线程的对象,其中,有三种方法可创建线程对象

    1.创建一个Thread的实例,传给它一个函数。

    2.创建一个Thread的实例,传给它一个可调用的类对象。

    3.从Thread派生出一个子类,创建一个这个子类的实例。

    下面将通过第三种方式派生类来创建线程对象:

    自定义继承于threading.Thread的通用MyThread类

     1 import threading
     2 from time import ctime
     3 
     4 class MyThread(threading.Thread):   #创建通用类MyThread子类化Thread
     5     def __init__(self,func,args,name=''):
     6         threading.Thread.__init__(self)
     7         self.name=name
     8         self.func=func
     9         self.args=args
    10 
    11     def getResult(self):    #用于返回调用线程的函数的结果
    12         return self.res
    13 
    14     def run(self):
    15         print('starting',self.name,'at:',ctime())
    16         self.res=self.func(*self.args)
    17         print(self.name,'finished at:',ctime())

    分别用单线程和多线程实现斐波那契、阶乘、和累加和

     1 from myThread import MyThread
     2 from time import ctime,sleep
     3 
     4 def fib(x): #斐波那契函数
     5     sleep(0.005)
     6     if x<2:
     7         return 1
     8     else:
     9         return (fib(x-2)+fib(x-1))
    10 
    11 def fac(x): #求阶乘
    12     sleep(0.1)
    13     if x<2:
    14         return 1
    15     else:
    16         return(x*fac(x-1))
    17 
    18 def sum(x): #求1到x的和
    19     sleep(0.1)
    20     if x<2:
    21         return 1
    22     else:
    23         return(x+sum(x-1))
    24 
    25 
    26 funcs=[fib,fac,sum]
    27 n=12
    28 
    29 def main():
    30     nfuncs=range(len(funcs))    #3
    31 
    32     print('*********SINGLE THREAD') #单线程
    33     for i in nfuncs:
    34         print('starting',funcs[i].__name__,'at:',ctime())
    35         print(funcs[i](n))  #分别调用三个函数,并将12作为参数传入
    36         print(funcs[i].__name__,'finished at:',ctime())
    37 
    38     print('
    ******MULTIPLE THREADS')   #多线程
    39     threads=[]      #线程池
    40     for i in nfuncs:
    41         t=MyThread(funcs[i],(n,),funcs[i].__name__) #传入函数对象,参数,函数名实例化线程
    42         threads.append(t)                           #将实例化后的线程加入线程池
    43 
    44     for i in nfuncs:                               #开启所有线程
    45         threads[i].start()
    46 
    47     for i in nfuncs:
    48         threads[i].join()                       #挂起程序直到线程结束
    49         print('********show the result')
    50         print(threads[i].getResult())
    51 
    52     print('all DONE')
    53 
    54 if __name__=='__main__':
    55     main()

    结果如下

     1 *********SINGLE THREAD
     2 starting fib at: Sun Apr  1 15:57:06 2018
     3 233
     4 fib finished at: Sun Apr  1 15:57:09 2018
     5 starting fac at: Sun Apr  1 15:57:09 2018
     6 479001600
     7 fac finished at: Sun Apr  1 15:57:10 2018
     8 starting sum at: Sun Apr  1 15:57:10 2018
     9 78
    10 sum finished at: Sun Apr  1 15:57:11 2018
    11 
    12 ******MULTIPLE THREADS
    13 starting fib at: Sun Apr  1 15:57:11 2018
    14 starting fac at: Sun Apr  1 15:57:11 2018
    15 starting sum at: Sun Apr  1 15:57:11 2018
    16 fac finished at: Sun Apr  1 15:57:12 2018
    17 sum finished at: Sun Apr  1 15:57:12 2018
    18 fib finished at: Sun Apr  1 15:57:13 2018
    19 ********show the result
    20 233
    21 ********show the result
    22 479001600
    23 ********show the result
    24 78
    25 all DONE
  • 相关阅读:
    java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List 转换异常
    React Swiper轮播图(二)
    超详细带你入门开发一个超实用的浏览器插件
    手臂太细如何增加纬度?这5个手臂锻炼动作,让你的手臂变粗壮
    2021百度世界大会精华总结(AI应用向)
    1、saltstack 安装部署
    MySQL的varchar(10)能存多少个汉字
    学习资料总结
    基于Spark的数据工厂(Data Factory):从设计到实现
    IntelliJ IDEA创建maven web项目(IDEA新手适用)
  • 原文地址:https://www.cnblogs.com/xiongxueqi/p/8686990.html
Copyright © 2011-2022 走看看