一进程和线程

1参考链接:

http://www.zhihu.com/question/25532384OF小工zhonyong 的回答

总结他们两的回答:

引言:

1.电脑的运行,在硬件上是CPU、相关寄存器、RAM之间的事情。负责处理任务的顺序有CPU决定。

2.程序的上下文:当CPU处理任务时,所需要的各种资源(显卡、寄存器等)准备完毕,构成了这个程序的执行环境,即上下文。

3.CPU处理任务顺序:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。

总结:

进程:包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

线程:CPU执行程序时所划分的各个‘迷你进程’,共享上下文环境。

2本书描述

进程(重量级进程):是程序的一次执行。

每个进程都有自己的地址空间、内存、数据栈及其他记录其运行轨迹的辅助数据。操作系统管理(这里应该是是指CPU)在其上运行的所有进程,并为这些进程公平的分配时间。

各个进程都有自己的内存空间、数据栈等,所以只能使用进程间通讯(iterprocess communication,IPC),而不能直接共享信息。

线程(轻量级进程):类似于进程,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境(同一片数据空间)。故这种并行和数据共享机制是多任务合作变为可能。

线程分为开始、顺序执行和结束三部分。有自己的指令指针,记录自己运行到什么地方。

线程的运行可能被抢占(中断),或暂时挂起(也叫作睡眠),让其他的线程运行,这叫做让步。

在单CPU系统中,不可能真正并行运行多线程。每个线程被安排成每次只运行一小会,然后把CPU让出来,让其他线程去运行。

在进程的整个运行过程中,每个线程都只做自己的事,在需要的时候跟其他的线程共享运行的结果。

二 Python、全局解锁器器(GIL)

在Python中,代码由Python虚拟机(也叫解释器主循环)来控制。

Python解释器中,可以存放多个线程,但任意时刻,只有一个线程在运行。

Python解释器由全局解释器锁(global interpreter lock,GIL)来控制。在多线程环境中,Python解释器按以下方式执行:

1.设置GIL

2.切换到一个线程中去运行

3.运行:

a.指定数量的字节码的指令,或

b.线程主动让出控制(调用time.sleep(n))

4.把线程设置为睡眠状态。

5.解锁GIL。

6.重复以上步骤。

三Python中关于线程模块的介绍

thread模块:提供了基本的线程和锁的支持。(OF小工的回答中有关于锁的形象介绍)

threading模块:提供了更高级别、功能更强的的线程管理功能。

Queue(队列)模块:运行用户创建一个可以用于多个线程之间共享数据的队列数据结构。

三不推荐使用thread模块原因

1.thread模块中的属性可能会与threading出现冲突。

2.thread模块的同步原语(关于线程的函数?)很少。

3.对进程结束时间没有控制(要使用锁)。

4.不支持守护线程

《Python核心编程》 18.多线程编程(一)的更多相关文章

  1. 进阶Java编程(1)多线程编程

    Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...

  2. SDK编程之多线程编程

    本课中,我们将学习如何进行多线程编程.另外我们还将学习如何在不同的线程间进行通信. 理论:前一课中,我们学习了进程,其中讲到每一个进程至少要有一个主线程.这个线程其实是进程执行的一条线索,除此主线程外 ...

  3. Java多线程编程(2)--多线程编程中的挑战

    一.串行.并发和并行   为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作:   第一种方式,先开始做工作A,完成之后再开始做工作B ...

  4. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

  5. 《Python核心编程》18.多线程编程(三)

    18.6使用threading模块 #!/usr/bin/env python # -*- coding:utf-8 -*- """从Thread类中派生出一个子例,创建 ...

  6. 《Python核心编程》18.多线程编程(二)

    18.1没有线程支持 #!/usr/bin/env python # -*- coding:utf-8 -*- from time import sleep, ctime def loop0(): p ...

  7. 18 多线程编程 - 《Python 核心编程》

  8. python核心编程(多线程编程)

    1.全局解释器锁 2.threading模块 thread类

  9. linux编程之多线程编程

    我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面 ...

随机推荐

  1. ORACLE等待事件:enq: TX - row lock contention

    enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...

  2. 机器学习实战笔记(Python实现)-00-readme

    近期学习机器学习,找到一本不错的教材<机器学习实战>.特此做这份学习笔记,以供日后翻阅. 机器学习算法分为有监督学习和无监督学习.这本书前两部分介绍的是有监督学习,第三部分介绍的是无监督学 ...

  3. MySQL 更新语句技巧

    一. 多表更新 1. 数据准备 mysql> mysql> select goods_id, goods_name,goods_cate from tdb_goods; +-------- ...

  4. js字符串转为日期格式

    1. <script type="text/javascript"> //字符串转日期格式,strDate要转为日期格式的字符串 function getDate(st ...

  5. centos7安装python3

    下载python3.5.2 wget http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tgz 如果提示错误可能是wget没有安装,用yun -y i ...

  6. MVC中的ActionLink生成的属性名称 中划线的解决办法

    当使用ActionLink来生成链接属性时,由于中划线的变量名称不符合命名规则,那么直接写中划线的变量时无法编译,此时只要改为下划线即可.Razor 引擎会自动转为中划线. 即 data_icon   ...

  7. 在 Azure HDInsight 中安装和使用 Spark

    Spark本身用Scala语言编写,运行于Java虚拟机(JVM).只要在安装了Java 6以上版本的便携式计算机或者集群上都可以运行spark.如果您想使用Python API需要安装Python解 ...

  8. 第16章 List集合的总结和遍历

    第16章 List集合的总结和遍历 1.重构设计 根据Vector类,ArrayList类,和LinkedList类所具有的存储特点以及拥有的方法入手,发现共性往上抽取. 共同特点: 1.允许元素重复 ...

  9. dpctl 工具使用

    一.在建立Mininet的时候,需要设置listenPort,这样可以在其它命令行里设置flow net = Mininet( topo=topo, listenPort=6634 ) 二.常见用法m ...

  10. 大三上 —— IOS五天实训

    第二天: 注册使用xib:1.首先为xib文件创建对象--let nib = UINib(nibName: "xib文件名", bundle: nil).2.具体的控件注册该xib ...