《Python核心编程》 18.多线程编程(一)
一进程和线程
1参考链接:
http://www.zhihu.com/question/25532384 中OF小工和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.多线程编程(一)的更多相关文章
- 进阶Java编程(1)多线程编程
Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...
- SDK编程之多线程编程
本课中,我们将学习如何进行多线程编程.另外我们还将学习如何在不同的线程间进行通信. 理论:前一课中,我们学习了进程,其中讲到每一个进程至少要有一个主线程.这个线程其实是进程执行的一条线索,除此主线程外 ...
- Java多线程编程(2)--多线程编程中的挑战
一.串行.并发和并行 为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作: 第一种方式,先开始做工作A,完成之后再开始做工作B ...
- 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...
- 《Python核心编程》18.多线程编程(三)
18.6使用threading模块 #!/usr/bin/env python # -*- coding:utf-8 -*- """从Thread类中派生出一个子例,创建 ...
- 《Python核心编程》18.多线程编程(二)
18.1没有线程支持 #!/usr/bin/env python # -*- coding:utf-8 -*- from time import sleep, ctime def loop0(): p ...
- 18 多线程编程 - 《Python 核心编程》
- python核心编程(多线程编程)
1.全局解释器锁 2.threading模块 thread类
- linux编程之多线程编程
我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面 ...
随机推荐
- SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...
- 弹窗样式 idialog,purebox,artdialog4.1.2,jquery.alert.v1.2
<script src="<?php echo $imgurl;?>/tools/media/js/jquery.iDialog.js"></scri ...
- 去掉Actionbar下的shadow
<item name="android:windowContentOverlay">@null</item> http://www.cnblogs.com/ ...
- NEST与JSON语法对照 一 match与multi_match
{ "query": { "bool": { "must": [ { "multi_match": { "qu ...
- Redis学习总结
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,其实当前最热门的NoSQL数据库之一,NoSQL还包括了Mem ...
- NOIP模拟赛20161114
幸运串 题意:长度为n,字符集大小为m的字符串中有多少不同的不含回文的串 n,m<10^9 我靠这不就是萌数的DP部分吗 有规律 f[2][j][k]=1 f[i][j][k]=sigma{f[ ...
- 洛谷P3390 【模板】矩阵快速幂
给定n*n的矩阵A,求A^k 行列都是n #include <iostream> #include <cstdio> #include <cstring> #inc ...
- python_面向对象编程
一.编程范式 程序员通过特定的语法+数据结构+算法告诉计算机如果执行任务,实现这个过程有不同的编程方式,对这些不同的编程方式进行归纳总结得出来的编程方式类别,即为编程范式 编程范式:面向过程编程.面向 ...
- jquery.lazyload 实现图片延迟加载jquery插件
看到了淘宝产品介绍中,图片是在下拉滚动条时加载,这是一个很不错的用户体验.减少了页面加载的时间了,也减轻了服务器的压力,就查了下用JQuery.. 什么是ImageLazyLoad技术 在页面上图 ...
- 使用startActivityForResult场景模拟
效果图如下,当我从第一个界面选择供应商的时候,我希望能得到第二个界面选择的供应商的值: 具体代码,这里第二个参数为自定义的大于等于0的数字,用来标记当前跳转. Intent i1 = new Inte ...