码迷,mamicode.com
首页 > 编程语言 > 详细

多线程局部变量之threading.local()用法

时间:2018-08-10 23:10:39      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:imp   start   任务   参数   color   独立   个人   问题   time   

假如,开了十个线程并且做同样的一件事,他们需要带着自己的数据进来,完成事情后带着自己的数据出去。如果是并发,同时进来,他们的数据就会混乱。

一般情况,我们加锁就可以了,一个人先进来,先加锁,另一个人过来看到加锁了,就在外面等,等里面的人出来,自己进去加锁,这样就不会出现数据混乱的问题。

另一种解决方法就是threading.local()来解决问题。

先看下面这个现象

from threading import Thread

ret = -1  # 先定义一个变量


def task(arg):  # 写个任务,加个参数
    global ret  # 声明ret全局变量
    ret = arg  # 每一个线程进来到要改这个变量
    print(ret)  # 每个线程来,改了ret,然后取ret的值


for i in range(10):  # i是线程的值,0 1 2 3 4 5 6 7 8 9
    t = Thread(target=task, args=(i,))  # 开10个线程
    t.start()
# 打印结果 0 1 2 3 4 5 6 7 8 9

这个程序开了10个线程,每个线程都执行了更改ret的值并获取ret更改后的值,如果非常快,他们取到的值都不一样.

如果让他们睡两秒再执行

from threading import Thread
import time

ret = -1  # 先定义一个变量


def task(arg):  # 写个任务,加个参数
    global ret  # 声明ret全局变量
    ret = arg  # 每一个线程进来到要改这个变量
    time.sleep(2)
    print(ret)  # 每个线程来,改了ret,然后取ret的值


for i in range(10):  # i是线程的值,0 1 2 3 4 5 6 7 8 9
    t = Thread(target=task, args=(i,))  # 开10个线程
    t.start()
# 打印结果 9 9 9 9 9 9 9 9 9 9

打印结果全是9

那么解决这个问题我们可以用threading.local()方法

from threading import Thread
from threading import local
import time
# 这是一个特殊的对象
ret = local()  # 先实例化一个对象


def task(arg):  # 写个任务,加个参数
    ret = arg  # 每一个线程进来都给他开辟一个独立的空间  单纯的threading.local()的作用就是这个
    time.sleep(2)
    print(ret)  # 每个线程来,改了ret,然后取ret的值


for i in range(10):  # i是线程的值,0 1 2 3 4 5 6 7 8 9
    t = Thread(target=task, args=(i,))  # 开10个线程
    t.start()
# 打印结果 0 3 2 5 7 9 8 4 1 6
threading.local()的作用就是为每个线程开辟一个独立的空间进行数据存储。

多线程局部变量之threading.local()用法

标签:imp   start   任务   参数   color   独立   个人   问题   time   

原文地址:https://www.cnblogs.com/aaronthon/p/9457330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!