Python多线程初步

Posted 善良超锅锅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多线程初步相关的知识,希望对你有一定的参考价值。

创建线程的两种方式

其一是继承threading.Thread对象,并覆写其run()方法。run()是线程执行主体。执行该类的start方法可以开启线程。

    
     
      import threading
     
     
      from time import sleep
     
     
       
     
     
      class MyThread(threading.Thread):
     
     
          def __init__(self):
     
     
              super().__init__()
     
     
       
     
     
          def run(self):
     
     
              sleep(5)
     
     
              print('This is', self.getName())
     
     
       
     
     
      if __name__ == '__main__':
     
     
          t1 = MyThread()
     
     
          t1.start()
     
     
       
     
     
          print('main threading...')
     
    
输出如下:
    
     
      main threading...
     
     
      This is Thread-1
     
     
      [Finished in 5.3s]
     
    


其二是创建一个threading.Thread对象,在构造时传递一个可调用对象给它,一般是一个函数,线程会执行这个函数

    
     
      import threading
     
     
      from time import sleep
     
     
       
     
     
      def print_name():
     
     
          name = threading.currentThread().getName()
     
     
          print(name)
     
     
          sleep(3)
     
     
       
     
     
      if __name__ == '__main__':
     
     
          t = threading.Thread(target=print_name)
     
     
          t.start()
     
     
       
     
     
          print('main thread...')
     
    

关于threading.Thread的join方法和daemon属性

join方法

join方法表示阻塞当前线程,直到目标线程执行结束或返回。修改前面第一个例子,在主线程中等待子线程结束
    
     
      import threading
     
     
      from time import sleep
     
     
       
     
     
      class MyThread(threading.Thread):
     
     
          def __init__(self):
     
     
              super().__init__()
     
     
       
     
     
          def run(self):
     
     
              sleep(5)
     
     
              print('This is', self.getName())
     
     
       
     
     
      if __name__ == '__main__':
     
     
          t1 = MyThread()
     
     
          t1.start()
     
     
          t1.join()
     
     
       
     
     
          print('main threading...')
     
    
输出如下:
    
     
      This is Thread-1
     
     
      main threading...
     
     
      [Finished in 5.3s]
     
    
这里主线程调用t1.join后就阻塞了,直到子线程结束(打印出 This is Thread - 1 ),然后主线程才继续执行(打印出 main threading ... )。 而第一个例子中是主线程调用t1.start开启子线程后继续执行自己的逻辑,先打印出 main threading ... ,然后再等待t1线程结束。
区别是:本例的主线程阻塞了自己的执行,等待子线程结束后再执行。而第一个例子的主线程没有阻塞自己的执行,而是执行完后再等待子线程。虽然都等待子线程执行结束,但第一个例子没有因为子线程而阻塞自己的执行。
join还有一个float类型timeout参数,表示等待目标线程多少秒。在这个时间内目标线程没有结束就不管了,本线程继续往后执行。

daemon属性

daemon是个bool值,以前和daemon属性相关的接口是isDaemon()和SetDaemo()方法,前者用来判断,后缀用来设置。现在直接访问daemon就可以了。 新建线程的daemon属性默认为False,如果将一个线程的daemo设置为True,则表示不需要等待这个线程。主线程退出后就退出程序,不过该子线程死活。主线程退出后,子线程只有被迫停止了。 将一个例子再修改一个,将其创建的子线程的daemon设置为True。注意daemon的值只能在调用start之前设置。否则引发异常。
    
     
      import threading
     
     
      from time import sleep
     
     
       
     
     
      class MyThread(threading.Thread):
     
     
          def __init__(self):
     
     
              super().__init__()
     
     
       
     
     
          def run(self):
     
     
              sleep(5)
     
     
              print('This is', self.getName())
     
     
       
     
     
      if __name__ == '__main__':
     
     
          t1 = MyThread()
     
     
          t1.daemon = True
     
     
          t1.start()
     
     
       
     
     
          print('main threading...')
     
    
这次的输出如下:
    
     
      main threading...
     
     
      [Finished in 0.3s]
     
    
主线程执行完,整个程序就退出了,子线程根本没机会执行打印任务。


第二种创建多线程的方法 参考了下面这篇博文,表示感谢: python 多线程就这么简单 - 虫师 - 博客园 http://www.cnblogs.com/fnng/p/3670789.html

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于Python多线程初步的主要内容,如果未能解决你的问题,请参考以下文章

python学习对多线程的初步了解

Python 多线程

多线程技术 初步

iOS多线程的初步研究-- NSTimer

Python关于Python多线程的一篇文章转载

多线程的初步理解