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多线程学习记录的更多相关文章

  1. python多线程学习(一)

    python多线程.多进程 初探 原先刚学Java的时候,多线程也学了几天,后来一直没用到.然后接触python的多线程的时候,貌似看到一句"python多线程很鸡肋",于是乎直接 ...

  2. python 多线程学习小记

    python对于thread的管理中有两个函数:join和setDaemon setDaemon:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.set ...

  3. Python多线程学习

    一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...

  4. Python多线程学习资料1

    一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...

  5. 《转》Python多线程学习

    原地址:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式 ...

  6. python多线程学习二

    本文希望达到的目标: 多线程同步原语:互斥锁 多线程队列queue 线程池threadpool 一.多线程同步原语:互斥锁 在多线程代码中,总有一些特定的函数或者代码块不应该被多个线程同时执行,通常包 ...

  7. Python爬虫学习记录【内附代码、详细步骤】

    引言: 昨天在网易云课堂自学了<Python网络爬虫实战>,视频链接 老师讲的很清晰,跟着实践一遍就能掌握爬虫基础了,强烈推荐! 另外,在网上看到一位学友整理的课程记录,非常详细,可以优先 ...

  8. python 多线程学习

    多线程(multithreaded,MT),是指从软件或者硬件上实现多个线程并发执行的技术 什么是进程? 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据.它们只有在被读取到内存中,被操作系 ...

  9. python爬虫学习记录

    爬虫基础 urllib,urllib2,re都是python自带的模块 urllib,urllib2区别是urllib2可以接受一个Request类的实例来设置url请求的headers,即可以模拟浏 ...

随机推荐

  1. php中header函数参数的Cache-control:private,no-cache,must-revalidate,max-age是使用方法!

    由于我做的是登录,也就是用户登录每次登陆时都要来访问服务器,不需要在客户机做缓存,于是在网上找了找,发下一下文章不错于是传了上来.网页的缓存是由HTTP消息头中的“Cache-control”来控制的 ...

  2. c语言考前最后一天

    明天就是考验这1个多月学习c语言的总结了,所以今天是个重要的日子,明天是个神圣的日子. 但是我还很多地方不明白,特别是函数,循环,这两个都是c语言最重要的,但我却没学好,上课还 时不时走神所以现在学的 ...

  3. break prefab instance的原理

    prefab可无限apply: 如果把一个模块做成了prefab,这个prefab可能在同一个scene中添加多个,甚至添加到了多个scene中.设所有这些实例为instance(1),instanc ...

  4. Struts2 Interceptor学习

    Interceptor的设计思想,其实是Spring里面的AOP思想,尽管Struts2又有自己的Interceptor但是,在实际开发中,用的较少,SSH整合之后你可以采用AOP事务处理进行拦截,更 ...

  5. 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版

    时隔一年多,终于朋友的忽悠下吧抢票Demo的最后一步完善了,与2014年1月9日成功生成车票. Demo仅经过自己测试,并未在高峰期进行测试,代码质量很差,因为赶工,套用去年模板并未使用设计模式. 代 ...

  6. java8日期时间

    ###与时间有关的5个包* java.time* java.time.chrono* java.time.format* java.time.temporal* java.time.zone###ja ...

  7. airline 設定 安裝

    .vimrc " install airline plugin using Vundle Plugin 'vim-airline/vim-airline' " install ai ...

  8. 泛型-List<T>

    声明一个int类型的泛型对象 List<int> list=new List<int>(); list.Add(44);//不用装箱 int i1=list[0];//也不会发 ...

  9. 使用 zssh 进行 Zmodem 文件传输

    Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...

  10. 使用.NET实现断点续传

    http://www.cnblogs.com/goody9807/archive/2007/06/05/772501.html 断点续传的原理在了解HTTP断点续传的原理之前,先来说说HTTP协议,H ...