Python多线程||POSIX线程||threading模块||主线程||子线程||父线程||Main 函数

Python的线程是真正的Posix Thread,而不是模拟出来的线程。

当 Linux 最初开发时,在内核中并不能真正支持线程。但是它的确可以通过 clone() 系统调用将进程作为可调度的实体。这个调用创建了调用进程(calling process)的一个拷贝,这个拷贝与调用进程共享相同的地址空间。LinuxThreads 项目使用这个调用来完全在用户空间模拟对线程的支持。不幸的是,这种方法有一些缺点,尤其是在信号处理、调度和进程间同步原语方面都存在问题。另外,这个线程模型也不符合 POSIX 的要求。

多线程能让你像运行一个独立的程序一样运行一段长代码。这有点像调用子进程(subprocess),不过区别是你调用的是一个函数或者一个类,而不是独立的程序。

so,what is Posix Thread?

  • POSIX Thread(维基)

POSIX线程(英语:POSIX Threads,常被缩写为Pthreads)是POSIX的线程标准,定义了创建和操纵线程的一套API。

again,what is POSIX

  • POSIX(可移植操作系统接口)

可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE(电气电子工程师学会,Institute of Electrical and Electronics Engineers)为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼(RMS)应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。

准备好了基础知识,下面看看如何用python的相关库_threadthreading实现多线程。

_thread是低级模块;

threading是高级模块,对_thread进行了封装。

常规情况下,使用threading

  • threading模块详解

Python 有一个全局解释器锁 (GIL),使得所有子线程都必须运行在同一个主线程中。使得无论电脑有多少个核,Python只能在一个处理器上运行。

当我们程序是I/O密集型,使用多线程会快很多。程序必定有个主线程,而我们创建的线程都是在主线程下创建的。在主线程上,启动一个线程后就扔在一旁不管了,继续回到主线程执行它的代码,当然,线程间(包括主线程)的资源是共享的。

  • 主线程与子线程

主线程:就是main函数,main函数就是主线程的入口。程序运行时,就有一个进程被操作系统(OS)创建,伴随着一个线程被创建,就是主线程。

子线程:主线程通过函数调用创建的低一级线程。threading.Thread(target= function_name)其中target参数就是子线程创建入口。

父线程:这是一个中间概念,主线程Main创建了子线程A,子线程A还可以创建更低一层的子线程a,此时,子线程A就是子线程a的父线程,同时a和A都是主线程Main的子线程。

程序运行的时候,系统会将我们的代码架在到内存当中,进入主线程,运行代码。

主线程与子线程有多种依存关系:

  1. 最常见的情况,主线程与子线程互不影响各自的生命周期,即主线程结束,子线程还可以继续执行;子线程结束,主线程也能继续执行;
  2. 主线程开启了子线程,但是主线程结束,子线程也随之结束;
  3. 主线程开启了一个子线程,主线程必须要等子线程运行完之后,才能结束主线程。
  • 参考

  1. Linux 线程模型的比较:LinuxThreads 和 NPTL
  2. POSIX 线程详解
  3. 廖雪峰的官方网站
  4. yungeisme Python线程Threading的简单教程
  5. NasubiZW 主线程与子线程的关系

.
.
.
2019-03-26 15:16:07写于浦东图书馆

你可能感兴趣的:(小白学Python)