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操作请求。

时间: 2024-08-04 18:10:56

python多线程学习记录的相关文章

python 系统地学习记录

由头: python值得一学. 尝试一下写学习记录,看看效果. 1.记录一些不熟悉或者重要的知识点. 2.记录一些遇到的问题,标签 Question. 书:python基础教程(第2版) Chapter 1:基础知识 本章的内容熟悉即可. 比较重要的是字符串,单双引号转义,str,repr... Time 1.5 h  2015.8.31 23:09 版权声明:本文为博主原创文章,未经博主允许不得转载.

python小白学习记录 多线程爬取ts片段

from lxml import etree import requests from urllib import request import time import os from queue import Queue import threading import re from multiprocessing import pool from urllib import request def download(urls): for index in range(0,1342): n =

Python多线程学习资料1

一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: view plaincopy to clipboardprint? import time import thread def timer(no, interval): cnt = 0 while cnt<10: print 'Thread:(%d) Time:%s\n'%(no, time.cti

Python多线程学习

一.Python中的线程使用:     Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: import time import thread def timer(no, interval): cnt = 0 while cnt<10: print 'Thread:(%d) Time:%s\n'%(no, time.ctime()) time.sleep(interval) cnt

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

引言: 昨天在网易云课堂自学了<Python网络爬虫实战>,视频链接 老师讲的很清晰,跟着实践一遍就能掌握爬虫基础了,强烈推荐! 另外,在网上看到一位学友整理的课程记录,非常详细,可以优先参考学习.传送门:请点击 本篇文章是自己同步跟着视频学习的记录,欢迎阅读~~~ 实验:新浪新闻首页爬虫实践 http://news.sina.com.cn/china/ 一.准备 浏览器内建的开发人员工具(以Chrome为例) Python3 requests 库 Python3 BeautifulSoup4

Python 多线程学习(转)

转自:http://www.cnblogs.com/slider/archive/2012/06/20/2556256.html 引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程.进程和异步 I/O 的支持.在许多情况下,通过创建诸如异步.线程和子进程之类的高层模块,Python 简化了各种并发方法的使用.除了标准库之外,还有一些第三方的解决方案,例如 Twisted.Stackless 和进程模块.本文重点关注于使用 Python 的线程,并使用了一些实际的示例进行说明

Python学习之(二) Python多线程学习

多线程的一个实例 #coding=utf-8 #!/usr/bin/python import time import thread def timer(no, interval): cnt = 0 while cnt<10: time.sleep(interval) print 'Thread:(%d) Time:%s' % (no, time.ctime()) cnt+=1 thread.exit_thread() def test(): #Use thread.start_new_thre

Python 多线程学习

个人总结创建多线程步骤: 1. import threading 2. 创建线程列表 threads = [] 3. 开辟线程 t1 = threading.Thread(…………) 这里注意用args传参是个元组 4. for t in threads循环线程列表,在循环体中用t.setDaemon(True)设置为守护线程后,如果不设置为守护线程程序会被无限挂起,在调用t.start()开始 5. 在for循环外用t.jion()阻塞父线程 class threading.Thread()说

简明 Python 教程--学习记录

注意,没有返回值的return语句等价于return None.None是Python中表示没有任何东西的特殊类型.例如,如果一个变量的值为None,可以表示它没有值.除非你提供你自己的return语句,每个函数都在结尾暗含有return None语句.通过运行printsomeFunction(),你可以明白这一点,函数someFunction没有使用return语句,如同:def someFunction():passpass语句在Python中表示一个空的语句块. 切片操作符中的第一个数(