python中的thread_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最常用的地方就是为每个线程绑定一个数据库连接

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值