python是单线程还是多线程,python多线程什么意思

  python是单线程还是多线程,python多线程什么意思

  

  一、线程的概念

  一个进程中至少有一个控制线程,进程的概念只是一个抽象的概念。真正在CPU上调度的是进程中的线程,就像实际在地铁里工作的线程一样。北京地铁至少要有一根线,是真的在工作。线程使用的是进程中包含的一堆资源,线程只是一个调度单元,不包含资源。

  什么时候需要启动多线程:一个进程中的多个线程共享这个进程中的资源,所以如果多个任务共享同一个资源,就需要启动多个线程。多线程是指在一个进程中启动多个线程。简单来说,如果多个任务共享同一个资源空间,那么在一个进程中必须启动多个线程。流程的这个任务可能对应于多个子任务。如果一个进程只打开一个线程,那么多个子任务之间的执行效果实际上是串行的,即一个程序只包含一条执行路径。

  对于计算密集型应用,应该使用多进程;对于IO密集型应用程序,应该使用多线程。创建线程的成本远低于创建进程的成本。

  二、Python中线程的特点

  1.在其他语言中,在一个进程中打开多个线程,每个线程可以被一个cpu使用。然而,在python中,一个进程中只能有一个线程同时运行。

  2.比如其他语言,比如我现在启动了一个进程,里面包含了几个线程。如果我现在有多个CPU,每个线程可以对应对应的CPU。

  3.但是在python中,如果我们现在打开一个进程,这个进程中有多个线程,同时只能运行一个线程。对于其他语言,在多CPU系统中,为了限制多核的使用,可以启动多个线程。但是Python中的多线程不能利用多核的优势。

  4.在同一个进程中,多个线程可以相互通信;但是进程间的通信必须基于IPC,一种消息通信机制(IPC机制包括队列和管道)。在一个进程中,改变主线程可能会影响其他线程的行为,但改变父进程不会影响其他子进程的行为,因为进程之间是完全隔离的。在python中,同一时间同一进程中只能运行一个线程。如果一个线程被系统调用阻塞,整个进程将被挂起。

  三、多线程的理解

  多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程间共享内存和变量,消耗的资源较少(但在Unix环境下,多进程和多线程的资源调度消耗差距不明显,Unix调度更快)。缺点是线程间的同步和锁定比较麻烦。

  相关:《Python视频教程》

  四、Python多线程创建

  在Python中,也可以实现多线程。有两个标准模块,thread和threading,但我们主要使用更高级的线程模块。使用示例:

  导入线程

  进口时间

  deftarget():

  打印“thecurentthreading % s running“% threading . current _ thread()。名字

  时间.睡眠(1)

  打印“thecurentthreading % s send“% threading . current _ thread()。名字

  打印“thecurentthreading % s running“% threading . current _ thread()。名字

  t=螺纹。线程(目标=目标)

  启动()

  t.join()

  print theCurentThreading % sisted % threading . current _ thread()。名称输出:

  客户nbsp

  ;threadingMainThreadisrunning

  thecurentthreadingThread-1isrunning

  thecurentthreadingThread-1isended

  thecurentthreadingMainThreadisendedstart是启动线程,join是阻塞当前线程,即使得在当前线程结束时,不会退出。从结果可以看到,主线程直到Thread-1结束之后才结束。

  Python中,默认情况下,如果不加join语句,那么主线程不会等到当前线程结束才结束,但却不会立即杀死该线程。如不加join输出如下:

  

thecurentthreadingMainThreadisrunning

  thecurentthreadingThread-1isrunning

  thecurentthreadingMainThreadisended

  thecurentthreadingThread-1isended

但如果为线程实例添加t.setDaemon(True)之后,如果不加join语句,那么当主线程结束之后,会杀死子线程。

  代码:

  

importthreading

  importtime

  deftarget():

  print'thecurentthreading%sisrunning'%threading.current_thread().name

  time.sleep(4)

  print'thecurentthreading%sisended'%threading.current_thread().name

  print'thecurentthreading%sisrunning'%threading.current_thread().name

  t=threading.Thread(target=target)

  t.setDaemon(True)

  t.start()

  t.join()

  print'thecurentthreading%sisended'%threading.current_thread().name

输出如下:

  

thecurentthreadingMainThreadisrunning

  thecurentthreadingThread-1isrunningthecurentthreadingMainThreadisended

如果加上join,并设置等待时间,就会等待线程一段时间再退出:

  

importthreading

  importtime

  deftarget():

  print'thecurentthreading%sisrunning'%threading.current_thread().name

  time.sleep(4)

  print'thecurentthreading%sisended'%threading.current_thread().name

  print'thecurentthreading%sisrunning'%threading.current_thread().name

  t=threading.Thread(target=target)

  t.setDaemon(True)

  t.start()

  t.join(1)

输出:

  

thecurentthreadingMainThreadisrunning

  thecurentthreadingThread-1isrunning

  thecurentthreadingMainThreadisended

主线程等待1秒,就自动结束,并杀死子线程。如果join不加等待时间,t.join(),就会一直等待,一直到子线程结束,输出如下:

  

thecurentthreadingMainThreadisrunning

  thecurentthreadingThread-1isrunning

  thecurentthreadingThread-1isended

  thecurentthreadingMainThreadisended

相关推荐:

  

Python中的多进程是什么

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: