python多线程学习记录
1.多线程的创建
import threading
t = t.theading.Thread(target, args……)
t.SetDeamon(True)//设置为守护进程
t.start(),启动线程
t.join(),阻塞当前线程,即使得在当前线程结束时,不会退出。会等到子线程结束之后才退出。
如果不加join语句,主线程不会等到子线程结束才结束,但却不会立即杀死该线程。
但是如果添加了SetDaemon(True),如果不加join,则会在主线程结束后马上杀死子线程。
如果join()加上时间,则会在一段时间之后再退出。
2.线程锁和Threadocal
(1)线程锁
多线程最大特点是线程之间可以共享数据,那么就会出现多线程之间同时改变一个变量,而出现死锁、数据错乱等情况。
比如,有一个global a, global b 有俩线程th1,th2,在某一时刻发生这样的情况:
th1拥有a,但是需要访问b;而th2拥有b,却需要访问a。
这时候th1,th2都互不相让,最后他们俩都饿死掉了。这就是死锁。
针对上述问题,出现了Lock,当访问某个资源之前先用Lock.acquire()锁住资源,访问之后再Lock.release()释放掉资源。
(2)TheadLocal
当不想将变量共享给其他线程时,可以使用局部变量,但是在函数中定义的局部变量使得在函数之间传递特别麻烦,TheadLocal就是特别的牛逼,了不起。
他解决了全局变量需要加锁,局部变量传递麻烦的两个问题。
local_school = theading.local()
定义一个Theadocal对象,此时local_school是一个全局变量,但是这个全局变量之能够在该线程中为全局变量,在其他线程看来他就是一个局部变量,别的线程不可更改之。
local_school = theading.local()
def process_thread(name):#绑定ThreadLocal的student
local_school.student = name
这个只有本线程可以修改,别的线程不可以。
ThreadLocal可以理解为一个dict,可以绑定不同的变量。
ThreadLocal使用最多的地方是每一个线程处理一个HTTP请求,在Flask框架中就是这个原理,它使用的是基于Werkzeug的LocalStack。
3.Map实现多线程
urls = ['www.google.com','www.luoxiaofeng.com', 'www.stackoverfolw.com']
results = map(urllib2.urlopen, urls)
map将每个元素当作参数分别传给urllib2.urlopen函数,并最后把结果放到results列表中。map一手包办了序列操作、参数传递和结果保存等一系列的操作。
其原理是将ruls中的每一个链接交给不同的cpu。map函数负责将线程分给不同的cpu。
在python中有两个库包含了map函数:mutilprocessing和它的子库multiprocessing.dummy。dummy是一个multiprocessing模块的完整克隆,唯一不同的是multiprocessing作用与进程,而dummy模块作用雨线程。
pool = ThreadPool()#创建县城池
results = pool.map(urllib2.urlopen, urls)#将不同的url传给各自的线程,并把执行结果返回到results中。
print results
pool.close()
pool.join()
4.Python多线程的缺陷:
不是真正多线程,因为有一个GIL,全局解释锁,该锁的存在保证在同一时间只有一个线程在真正执行任务,也就是多线程不是真正并发,只是交替的执行。假如有10个线程在10个cpu上,当前工作也只能是一个cpu上的线程。
5.应用场景:
适合在IO密集型任务中。因为I/O密集型执行期间大部分时间是用在I/O上,如数据库I/O,较少时间用在CPU计算上。因此,此场景可以使用python多线程,当一个任务阻塞在IO操作上时,我们可以立即切换执行其他线程上的其他IO操作请求。

python多线程学习记录的更多相关文章
- python多线程学习(一)
python多线程.多进程 初探 原先刚学Java的时候,多线程也学了几天,后来一直没用到.然后接触python的多线程的时候,貌似看到一句"python多线程很鸡肋",于是乎直接 ...
- python 多线程学习小记
python对于thread的管理中有两个函数:join和setDaemon setDaemon:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.set ...
- Python多线程学习
一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1. 函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...
- Python多线程学习资料1
一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1. 函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...
- 《转》Python多线程学习
原地址:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式 ...
- python多线程学习二
本文希望达到的目标: 多线程同步原语:互斥锁 多线程队列queue 线程池threadpool 一.多线程同步原语:互斥锁 在多线程代码中,总有一些特定的函数或者代码块不应该被多个线程同时执行,通常包 ...
- Python爬虫学习记录【内附代码、详细步骤】
引言: 昨天在网易云课堂自学了<Python网络爬虫实战>,视频链接 老师讲的很清晰,跟着实践一遍就能掌握爬虫基础了,强烈推荐! 另外,在网上看到一位学友整理的课程记录,非常详细,可以优先 ...
- python 多线程学习
多线程(multithreaded,MT),是指从软件或者硬件上实现多个线程并发执行的技术 什么是进程? 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据.它们只有在被读取到内存中,被操作系 ...
- python爬虫学习记录
爬虫基础 urllib,urllib2,re都是python自带的模块 urllib,urllib2区别是urllib2可以接受一个Request类的实例来设置url请求的headers,即可以模拟浏 ...
随机推荐
- java多线程系类:JUC原子类:04之AtomicReference原子类
概要 本章对AtomicReference引用类型的原子类进行介绍.内容包括:AtomicReference介绍和函数列表AtomicReference源码分析(基于JDK1.7.0_40)Atomi ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 增加安全性增加内网的电脑才可以调用的限制
大型业务应用系统很容易受到各种攻击,每加上一道防护就可以减少80%-90%的攻击.我们的核心接口组件里也做了一些限制,有些接口方法只有内网的用户才可以调用,防止外网的用户调用,这样安全性会有很大的提升 ...
- 在基于vue的webpack脚手架开发中使用了代理转发,结果浏览器发出的请求中不带cookie导致登录时总是session失效怎么办?
环境: 有2个业务接口需要转发到82的服务器上: ../user/getCode.do ../user/doLogin.do 现象: 使用上述的 ...
- 使用Nancy.Host实现脱离iis的Web应用
本篇将介绍如何使用Nancy.Host实现脱离iis的Web应用,在开源任务管理平台TaskManagerV2.0代码里面已经使用了Nancy.Host实现自宿主的Web应用.学习Nancy之前最好了 ...
- VMware Workstation中网络连接之桥接、NAT和Host-only
在Windows XP系统中,安装好VMware Workstation虚拟机软件以后,我们可以查看一下"网络连接"窗口: 在窗口中多出了两块网卡: VMware Network ...
- 77 swapoff-关闭系统交换区
Linux swapoff命令用于关闭系统交换区(swap area). swapoff实际上为swapon的符号连接,可用来关闭系统的交换区. 语法 swapoff [设备] 参数: -a 将/et ...
- 即使用ADO.NET,也要轻量级实体映射,比Dapper和Ormlite均快
不管出于什么原因,有时候框架人员摒弃了NH或EF,而使用原生数据库访问对象. 为了优美的编程,用上我写的轻量级映射扩展方法吧 目的:将SqlDataReader自动转换成T类型 代码如下: /// & ...
- jinfo_动态调整JVM参数(无需重启)(实践)
本文演示在JVM进程运行过程中动态开启/关闭 GC输出,无需重启JVM进程 jinfo使用介绍 可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数 -flag < ...
- PRINCE2第二个原则
PRINCE2要求项目团队吸取以前的经验教训,在项目生命周期中发现.记录和应对.吸取经验教训,应该记录在整个生命周期中,项目准备期应该回顾以往类似项目,看看是否有经验教训可以应用,如果项目是第一次做, ...
- 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...