python 线程(thread)
#coding:utf-8
#多线程
#Python的标准库提供了两个模块:thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装
#绝大数情况下,我们只需要使用threading这个高级模块
#启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行
import time,threading
def loop():
print 'thread %s is runing...' % threading.current_thread().name
n = 0
while n < 5:
n = n + 1
print 'thread %s >>> %s' %(threading.current_thread().name,n)
time.sleep(1)
print 'thread %s ended' %threading.current_thread().name
print 'thread %s is running' %threading.current_thread().name
#创建一个线程对象,参数1为函数名字,参数name为线程名字
t = threading.Thread(target = loop,name = 'LoopThread')
#启动线程
t.start()
#阻塞主线程等待LoopThread线程执行完毕
t.join()
print 'thread %s ended' %threading.current_thread().name
多线程中的锁
#coding:utf-8
#多线程和多进程的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享
#所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时修改一个变量
#我们定义了一个共享变量balance,初始值为0,并且启动两个线程,先存后取,理论上结果应该为0,但是,由于
#线程的调度是由操作系统决定的t1,t2交替执行时,只要循环次数足够多,balance的结果就不一定是0了
import threading,time
balance = 0
#获取一个锁对象
lock = threading.Lock()
def change_it(n):
global balance
balance = balance + n
balance = balance - n
def run_thread(n):
for i in range(100000):
#获得锁
lock.acquire()
try:
change_it(n)
finally:
#改完了一定要释放锁
lock.release()
t1 = threading.Thread(target = run_thread,args =(5,))
t2 = threading.Thread(target = run_thread,args = (8,))
t1. start()
t2.start()
t1.join()
t2.join()
print balance
#如果我们要确保balance计算正确, 就要给change_its上一把锁,当某个线程开始执行change_it()时,我们
#说该线程获得了锁,因此其他线程不能同时执行change_it()只能等待,直到锁被释放后,获得该锁以后才能改
#由于锁只有一个,无论多少线程,同一时刻最多只有一个线程持有该锁,所以不会造成修改的冲突。创建一个锁
#就是通过threding.Lock()来实现
ThreadLocal
#coding:utf-8
#在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,
#因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。
#但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦
#ThreadLocal应运而生
import threading
#创建全局ThreadLocal对象
local_school = threading.local()
def process_student():
print 'Hello %s (in %s)' % (local_school.student,threading.current_thread().name)
def process_thread(name):
#绑定ThreadLocal的student
local_school.student = name
process_student()
#创建线程对象1
t1 = threading.Thread(target = process_thread, args =('paulversion',),name = 'Thread-A')
#创建线程对象2
t2 = threading.Thread(target = process_thread,args =('Floki',),name = 'Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()
#全局变量local_school 就是一个ThreadLocal对象,每个Thread对它都可以读取student属性,单互不影响,你可以把local_shool看成全局变量
#但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部 会处理
#可以理解为全局变量local_school是一个dict,不但可以用local_school.student,还可以绑定其他变量,如local_school.teacher等等
#Threadlocal最常用的地方就是为每个线程绑定一个数据库连接
python 线程(thread)的更多相关文章
- python 线程创建和传参(28)
在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程. 有了单线程的话,什么又是多线程? ...
- python——线程与多线程进阶
之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...
- python——线程与多线程基础
我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...
- [python] 线程简介
参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...
- PYTHON线程知识再研习A
前段时间看完LINUX的线程,同步,信息号之类的知识之后,再在理解PYTHON线程感觉又不一样了. 作一些测试吧. thread:模块提供了基本的线程和锁的支持 threading:提供了更高级别,功 ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- python线程与进程手记
------------------------------线程---------------------------#线程应用的第一种方式:thread模块是比较底层的模块#import threa ...
- Python线程:线程的调度-守护线程
Python线程:线程的调度-守护线程 守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.在python中建议使用的是thread. ...
- python 线程(一)理论部分
Python线程 进程有很多优点,它提供了多道编程,可以提高计算机CPU的利用率.既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的. 主要体现在一下几个方面: 进程只能在 ...
随机推荐
- kafka启动报错:kafka.common.KafkaException: Failed to acquire lock on file .lock
kafka 异常退出后重启时遇到的问题 解决: 执行 netstat -lnp|grep 9092 在执行结果中找到进程号执行 kill -9 进程号再尝试启动Kafka
- 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level 学习了:https://blog.csdn. ...
- org.hibernate.exception.ConstraintViolationException: could not delete:
转自:http://fireinwind.iteye.com/blog/848515 异常描述: org.hibernate.exception.ConstraintViolationExceptio ...
- git删除历史
Git如何永久删除文件(包括历史记录) 有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的), 而且上传的文件又特别大的时候, 这将导致别 ...
- vue 项目中 自定义 webpack 的 配置文件(webpack.config.babel.js)
webpack.config.babel.js,这样命名是想让webpack在编译的时候自动识别es6的语法,现在貌似不需要这样命名了,之前用webpack1.x的时候貌似是需要的 let path ...
- 设置客户端连接PostgreSQL不需要密码
平常工作中,有时需要远端连接 PostgreSQL 数据库做些维护,例如远端备份等:如果备份脚本写在远端机器,备份的时候会弹出密码输入提示,那么脚本就不能后台执行,这里总结了几种不弹出密码输入提示的方 ...
- 2014哈商大ICPC/ACM校赛解题报告
被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数 ...
- 【web开发学习笔记】Structs2 Result学习笔记(一)简介
Structs2 Result学习笔记(一)简介 问题一 <struts> <constant name="struts.devMode" value=" ...
- 对象关系映射 EmitMapper 及Tuple的使用
public TDestination Map<TSource, TDestination>(TSource tSource) { if (tSource == null) return ...
- webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc ((); 或者 Unexpected token: operator (>)
webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc ((); 或者 Unexpected token: operator (>) 解决方案 ...