thread模块—Python多线程编程
Thread 模块
*注:在实际使用过程中不建议使用 thread 进行多线程编程,本文档只为学习(或熟悉)多线程使用。
Thread 模块除了派生线程外,还提供了基本的同步数据结构,称为锁对象(lock object,也叫原语锁、互斥锁、互斥和二进制信号量)。
常用线程函数以及 LockType 锁对象的方法:
| 函数/方法 | 描述 |
|---|---|
| thread 模块的函数 | |
| start_new_thread(function, args, kwargs=None) | 派生一个新的线程,使用给定的 args 和可选的 kwargs 来执行 function |
| allocate_lock() | 分配 LockType 锁对象 |
| exit() | 给线程退出指令 |
| LockType 锁对象方法 | |
| acquire(wait=None) | 尝试获取锁对象 |
| locked() | 如果获取了锁对象则返回True,否则返回 Flase |
| release() | 释放锁 |
使用 thread 模块的简单例子,代码如下(mtsleepA.py):
import thread
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(2)
print 'loop 1 Done at:', ctime()
def main():
print 'starting at:', ctime()
thread.start_new_thread(loop0, ())
thread.start_new_thread(loop1, ())
sleep(6)
print 'all DONE at:', ctime()
if __name__ == '__main__':
main()
输出结果:
starting at: Sun Jul 22 21:38:00 2018
start loop 0 at: Sun Jul 22 21:38:00 2018
start loop 1 at: Sun Jul 22 21:38:00 2018
loop 1 Done at: Sun Jul 22 21:38:02 2018
loop 0 Done at: Sun Jul 22 21:38:04 2018
all DONE at: Sun Jul 22 21:38:06 2018
在这个脚本的代码中,增加了一个 sleep(6) 调用,为什么要这么做呢?这是因为如果我们没有阻止主线程继续执行,它将会继续执行下一条语句,显示“all done”然后退出,而 loop0() 和 loop1() 这两个线程将直接终止。
使用线程和锁的简单例子,代码如下(mtsleepB.py):
import thread
from time import sleep, ctime
loops = [4,2]
def loop(nloop, nsec, lock):
print 'start loop', nloop, 'at:', ctime()
sleep(nsec)
print 'loop', nloop, 'done at:', ctime()
lock.release() # 释放锁
def main():
print 'starting at:', ctime()
locks = []
nloops = range(len(loops))
for i in nloops:
lock = thread.allocate_lock() # 分配 LockType 对象
lock.acquire() # 尝试获取锁对象
locks.append(lock)
for i in nloops:
thread.start_new_thread(loop, (i, loops[i], locks[i])) # 派生新线程 for i in nloops:
# 等待所有锁释放后退出循环继续后面操作
while locks[i].locked(): # 当获取了锁的时候为 True,所有的锁都释放后为 Flase
pass
print 'all DONE at:', ctime()
if __name__ == '__main__':
main()
输出结果为:
starting at: Sun Jul 22 22:25:45 2018
start loop 1 at:start loop Sun Jul 22 22:25:45 2018
0 at: Sun Jul 22 22:25:45 2018
loop 1 done at: Sun Jul 22 22:25:47 2018
loop 0 done at: Sun Jul 22 22:25:49 2018
all DONE at: Sun Jul 22 22:25:49 2018
main() 函数中锁相关的主要流程(第一个 for 循环)解释:
首先创建一个锁列表,通过使用 thread.allocate_lock() 函数得到锁对象;
再通过 acquire() 方法取得每个锁(取得锁的效果相当于“把锁锁上”);
把锁锁上后将它添加到锁列表 locks 中;
为什么不在上锁的循环中启动线程呢?
第一,想要同步线程,让所有的线程最后同时都完成;
第二,获取锁需要花费一点时间,避免线程执行的太快,在获取锁之前线程就执行结束。
thread模块—Python多线程编程的更多相关文章
- threading模块—Python多线程编程
Threading 模块 threading 模块除了提供基本的线程和锁定支持外,还提供了更高级别.功能更全面的线程管理.threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户 ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- python 多线程编程
这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- 关于python多线程编程中join()和setDaemon()的一点儿探究
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 ...
- python多线程编程-queue模块和生产者-消费者问题
摘录python核心编程 本例中演示生产者-消费者模型:商品或服务的生产者生产商品,然后将其放到类似队列的数据结构中.生产商品中的时间是不确定的,同样消费者消费商品的时间也是不确定的. 使用queue ...
- 线程和Python—Python多线程编程
线程和Python 本节主要记录如何在 Python 中使用线程,其中包括全局解释器锁对线程的限制和对应的学习脚本. 全局解释器锁 Python 代码的执行是由 Python 虚拟机(又叫解释器主循环 ...
- python多线程编程(3): 使用互斥锁同步线程
问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...
随机推荐
- vue2.x学习笔记(三)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12562137.html. vue实例 要使用vue提供的特性与功能,都需要通过vue实例来使用. 创建一个vue实 ...
- 详解 字符串—— String、StringBuffer 与 StringBuilder
本来这篇博文的内容,本人打算在之后的代码中一点一点通过实例讲解的,但是,本人发现,其实这里的知识点还是蛮重要的. 并且,字符串类型,在任何的程序语言中都是被认真对待的,所以,今天专门写一篇博文来介绍一 ...
- vue使用trackingjs
前言:因为公司是做人工智能-AI的,所有一个web数据平台为了装X,需要做个人脸登陆.前台需要把人脸的base64发给后台去做人脸校验. 功能很简单,需要注意的是web需要实现“调用摄像头”和“自动拍 ...
- Python爬虫---爬取腾讯动漫全站漫画
目录 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源网页代码 下载漫画图片 下载结果 完整 ...
- ubuntu(Linux)下,查看CPU性能集合
CPU: 详细:cat /proc/cpuinfo型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}'数量:ls ...
- win10好用的桌面工具分享+网盘下载链接
1.Everything Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录(Locate files and folders by name in ...
- Go语言: 万物皆异步
来源:https://www.jianshu.com/p/62c0cd107da3 同步和异步.阻塞和非阻塞 首先要明确的是,同步(Synchronous)和异步(Asynchronous),阻塞(B ...
- Makefile: missing separator(did you mean TAB instead of 8 spaces?). Stop.
通常我们会对vimrc文件加以配置(如将TAB键自动转换为4个空白键). 但正是由于将tab键转换为n个空白键,使得用vim编写的Makefile中不存在tab键(即“\t”)了.恰恰Makefile ...
- cocos2dx新建项目
首先你得下载好cococs2dx,还有python2.x版本,还有vs2017 然后cmd在你Cocos2dx的路径下输入 python setup.py 然后你就回车回车回车 然后重新打开cmd 这 ...
- Latex-0-latex2word
Latex-0-latex2word LatexXeLaTex Latex 转 Word 虽然latex 格式很方便,能够满足绝大部分的排版要求,但是在与人沟通的时候不可避免地需要用到其他格式文件,比 ...