• 【Python@Thread】threading模块


      theading模块的Thread类

    属性:

        name   线程名

        ident   线程标识符

        daemon   布尔值,标示是否为守护线程

    方法:

      __init__(target=None, name=None, *args=(), **kwargs={})

      start()   开始执行线程

      run()    定义线程功能的方法

      join(timeout=None)  阻塞线程,等待被唤醒,好于忙等待

    Thread类的使用主要有三种方法:

    1.创建Thread实例,传给其一个参数

    2.创建Thread实例,传给其一个可调用的类实例

    3.派生Thread子类,创建子类实例

    下面介绍这三种用法:

    1.创建Thread实例,传给其一个参数

     1 from threading import Thread
     2 from time import ctime, sleep
     3 
     4 loops = [4, 2]
     5 
     6 
     7 def loop(nloop, nsec):
     8     print('loops ', nloop, 'starting at:', ctime())
     9     sleep(nsec)
    10     print('loop', nloop, 'end at:', ctime())
    11 
    12 
    13 def main():
    14     print('starting at:', ctime())
    15     threads = []
    16 
    17     for i in range(len(loops)):
    18         t = Thread(target=loop, args=(i,loops[i]))
    19         threads.append(t)        ###保存类实例
    20 
    21     for i in range(len(loops)):
    22         threads[i].start()        ###同时启动类实例
    23 
    24     for i in range(len(loops)):
    25         threads[i].join()          ###保持主线程切出
    26 
    27     print('all done at:', ctime())
    28 
    29 if __name__ == '__main__':
    30     main()

    运行结果:

    starting at: Mon Dec 19 23:29:58 2016
    loops 0 starting at: Mon Dec 19 23:29:58 2016
    loops 1 starting at: Mon Dec 19 23:29:58 2016
    loop 1 end at: Mon Dec 19 23:30:00 2016
    loop 0 end at: Mon Dec 19 23:30:02 2016
    all done at: Mon Dec 19 23:30:02 2016

      方法1,传入函数创建类实例,不用人为设置锁,释放锁

    方法二:传入可调用类创建类实例(用法感觉有点像装饰器)

     1 from threading import Thread
     2 from time import ctime, sleep
     3 
     4 loops = [4, 2]
     5 
     6 
     7 class TFun():
     8     def __init__(self, name, func, args):
     9         self.name = name
    10         self.func = func
    11         self.args = args
    12 
    13     def __call__(self):
    14         return self.func(*self.args)
    15 
    16 
    17 def loop(nloop, nsec):
    18     print('loop ', nloop, 'at:', ctime())
    19     sleep(nsec)
    20     print('loop ', nloop, 'at:', ctime())
    21 
    22 
    23 def main():
    24     print('starting at:', ctime())
    25     threads = []
    26 
    27     for i in range(len(loops)):
    28         t = Thread(target=TFun(loop.__name__, loop, (i,loops[i])))
    29         threads.append(t)
    30 
    31     for i in range(len(loops)):
    32         threads[i].start()
    33 
    34     for i in range(len(loops)):
    35         threads[i].join()
    36 
    37     print('all done at:', ctime())
    38 
    39 if __name__ == '__main__':
    40     main()

    运行结果:

    starting at: Mon Dec 19 23:46:31 2016
    loop 0 at: Mon Dec 19 23:46:31 2016
    loop 1 at: Mon Dec 19 23:46:31 2016
    loop 1 at: Mon Dec 19 23:46:33 2016
    loop 0 at: Mon Dec 19 23:46:35 2016
    all done at: Mon Dec 19 23:46:35 2016

    方法三:

    派生Thread子类,创建子类实例

     1 from threading import Thread
     2 from time import ctime, sleep
     3 
     4 loops = [4, 2]
     5 
     6 
     7 class mythread(Thread):
     8     def __init__(self, func, args, name=''):
     9         Thread.__init__(self)
    10         self.name = name
    11         self.func = func
    12         self.args = args
    13         self.name = name
    14 
    15     def run(self):          #注意不是__call__(self)
    16         self.func(*self.args)
    17 
    18 
    19 def loop(nloop, nsec):
    20     print('loop', nloop, 'at:', ctime())
    21     sleep(nsec)
    22     print('loop ', nloop, 'end at:', ctime())
    23 
    24 
    25 def main():
    26     print('starting at:', ctime())
    27     threads = []
    28 
    29     for i in range(len(loops)):
    30         t = mythread(loop,(i,loops[i]))
    31         threads.append(t)
    32 
    33     for i in range(len(loops)):
    34         threads[i].start()
    35 
    36     for i in range(len(loops)):
    37         threads[i].join()
    38 
    39     print('end at:', ctime())
    40 
    41 if __name__ == '__main__':
    42     main()

    运行结果:

    starting at: Tue Dec 20 00:06:00 2016
    loop 0 at: Tue Dec 20 00:06:00 2016
    loop 1 at: Tue Dec 20 00:06:00 2016
    loop 1 end at: Tue Dec 20 00:06:02 2016
    loop 0 end at: Tue Dec 20 00:06:04 2016
    end at: Tue Dec 20 00:06:04 2016

      方法二和方法三可以测试多个函数,其中方法三更加直观。但是方法1更加简单

     参考资料:Python核心编程.第四章.Wesley Chun著

  • 相关阅读:
    最长上升子序列问题总结
    Problem C
    Problem C
    Problem P
    Problem P
    Problem H
    Problem H
    Problem D
    Problem D
    Linux系统调用--getrlimit()与setrlimit()函数详解
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6201156.html
Copyright © 2020-2023  润新知