线程和Python—Python多线程编程
线程和Python
本节主要记录如何在 Python 中使用线程,其中包括全局解释器锁对线程的限制和对应的学习脚本。
全局解释器锁
Python 代码的执行是由 Python 虚拟机(又叫解释器主循环)进行控制的。
对 Python 虚拟机的访问是由全局解释器锁(GIL)控制的。步骤为:
设置 GIL;
切换进一个线程去运行;
执行下面操作之一:
a. 指定数量的字节代码指令;
b. 线程主动让出控制权(可以调用 time.sleep(0) 来完成)。
把线程设置回睡眠状态(切换出线程);
解锁 GIL;
重复上述步骤
退出线程
当一个线程完成函数的执行时,它就会退出。
退出的方法还有:
通过调用如 thread.exit() 之类的退出函数;
如 sys.exit() 之类的退出 Python 进程的标准方法;
抛出 SystemExit 异常,来使线程退出。
不能直接“终止”一个线程;
在 Python 中使用线程
Python 虽然支持多线程编程,但是还需要取决于它所运行的操作系统。
支持多线程的操作系统:绝大多数类 UNIX 平台(如 Linux、Solaris、Mac OS X、*BSD等)以及 Windows 平台;
要确定解释器(或者说你的系统)是否支持线程,可以从交互式解释器中尝试导入 thread 模块,如果可用则不会产生错误。如下:
>>> import thread
如果 Python 解释器没有将线程支持编译进去,模块导入将会失败
>>> import thread
Traceback (most recent call last): File "<stdin>", line 1, in <module>ModuleNotFoundError: No module named 'thread'
**注:在 Python 3 中 thread 模块被重命名为 _thread (原因为平常使用不推荐用 thread 模块,只建议那些想访问线程的更底层级别的专家使用)。
不使用线程的情况
通过一个简单的例子代码来演示在不使用线程的情况下是如何工作的,方便后面对比使用线程的情况。以下为代码:
#!/usr/bin/env python
from time import sleep, ctime
def loop0():
print('start loop 0 at:', ctime())
sleep(4)
print('loop 0 done at:', ctime())
def loop1():
print('start loop 1 at:', ctime())
sleep(3)
print('loop 1 done at:', ctime())
def main():
print('starting at:', ctime())
loop0()
loop1()
print('all DONE at:', ctime())
if __name__ == '__main__':
main()
运行后的输出结果:
starting at: Sun Jul 22 17:15:13 2018
start loop 0 at: Sun Jul 22 17:15:13 2018
loop 0 done at: Sun Jul 22 17:15:17 2018
start loop 1 at: Sun Jul 22 17:15:17 2018
loop 1 done at: Sun Jul 22 17:15:20 2018
all DONE at: Sun Jul 22 17:15:20 2018
Python 的线程模块
Python 提供了多个模块来支持多线程编程,包括 thread 、threading 和 Queue 模块等。
thread 模块提供了基本的线程和锁定支持;
threading 模块提供了更高级别、功能更全面的线程管理;
Queue 模块可以创建一个队列数据结构,用于在多线程之间进行共享;
在实际进行多线程编程过程中应该避免使用 thread 模块:
threading 模块更加先进、有更好的进程支持,thread 模块中的一些熟悉会和 threading 模块冲突;
thread 模块拥有的同步原语注释只有一个(同步原语用于控制执行和访问);
[注释] 常见的比如锁(Lock)、可重入锁(RLock)thread 模块对进程何时退出没有控制。当主线程结束时,所有其它线程也都强制结束,不会发出警告或者进行适当的清理。
线程和Python—Python多线程编程的更多相关文章
- Python的多线程编程
提到多线程,很多人就会望而却步,本文将由浅入深地带你攻克python多线程编程,并防止你跳入深坑, 首先看一段简单的代码: from time import ctime,sleep def play_ ...
- python --- 基础多线程编程
在python中进行多线程编程之前必须了解的问题: 1. 什么是线程? 答:线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程 ...
- 【转】使用python进行多线程编程
1. python对多线程的支持 1)虚拟机层面 Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,暂时无法利用多处理器的优势.使 ...
- 【Python】多线程编程
1.thread模块 2.threading模块 3.Queue模块与多线程互斥 简介: thread和threading模块允许创建和管理线程,thread模块提供了基本的线程和锁的支持,而thre ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
- 转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
- Python:多线程编程
1.IO编程 IO(input/output).凡是用到数据交换的地方,都会涉及io编程,例如磁盘,网络的数据传输.在IO编程中,stream(流)是一种重要的概念,分为输入流(input strea ...
- python爬虫多线程编程
#使用了线程库 import threading from queue import Queue from bs4 import BeautifulSoup import json import re ...
- Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
- python 多线程编程
这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...
随机推荐
- linux常用命令--打包和压缩文件
bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 bzip2 file1 压缩一个叫做 'file1' 的文件 gunzip file1.gz 解压一个叫做 'file1 ...
- bytectf2019 boring_code的知识学习&&无参数函数执行&&上海市大学生CTF_boring_code+
参赛感悟 第三次还是第二次参加这种CTF大赛了,感悟和学习也是蛮多的,越发感觉跟大佬的差距明显,但是还是要努力啊,都大三了,也希望出点成绩.比赛中一道WEB都没做出来,唯一有点思路的只有EZCMS,通 ...
- jmeter DB2数据库连接与操作
1.需要把数据库连接jar包拷贝到 jmeter lib目录下 先创建一个数据库连接配置元件 2.添加jdbc请求(我用的后置处理器) 3.可以通过beanshell 对结果集进行操作 beanshe ...
- C# WCF的通信模式
wcf 通信模式一般分为三种; 1,请求/响应模式 2,单工模式 3,双工模式 一,请求/响应模式 请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应.这也意味着在接收到服务的响应以 ...
- JS 获取GET 参数
对于 URL,我们需要了解更多,因为我们的开发中可能会需要提取URL的部分信息来做不同的事情,事实上这也是与后端交互的一种独特的方式,当然这肯定是安全的,当请求被返回,关于 url 的信息就被记录在了 ...
- Libra教程之:Libra协议的关键概念
文章目录 Libra协议 交易和状态 交易详解 账本状态详解 版本数据库 账户 账户地址 Proof 验证节点 存储 Libra协议 Libra协议是Libra区块链的基础,本文主要讲解Libra协议 ...
- #Week6 Neural Networks : Representation
一.Non-linear Hypotheses 线性回归和逻辑回归在特征很多时,计算量会很大. 一个简单的三层神经网络模型: \[a_i^{(j)} = \text{"activation& ...
- 解决vue中BMap未定义问题
原文链接: 点我 最近在项目中使用了百度地图来显示物流信息,实现方式有两种: 引用Vue Baidu Map引用BMap存在的问题:\color{red}{存在的问题:}存在的问题::使用BMap可以 ...
- CodeForces-1058B B. Vasya and Cornfield
这题,我真的不知道题解是啥,自己看代码吧. #include<iostream> using namespace std; int main() { int n, d,m,i,x,y; c ...
- HDU - 6187 (最大生成树) 最小生成树
Destroy Walls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...