栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python中的线程本地存储

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python中的线程本地存储

例如,如果您有一个线程工作池,并且每个线程都需要访问其自己的资源(例如网络或数据库连接),则线程本地存储很有用。请注意,该

threading
模块使用常规的线程概念(可以访问进程全局数据),但是由于全局解释器锁定,它们并不是太有用。不同的
multiprocessing
模块会为每个模块创建一个新的子流程,因此任何全局变量都将是线程局部的。

穿线模块

这是一个简单的示例:

import threadingfrom threading import current_threadthreadLocal = threading.local()def hi():    initialized = getattr(threadLocal, 'initialized', None)    if initialized is None:        print("Nice to meet you", current_thread().name)        threadLocal.initialized = True    else:        print("Welcome back", current_thread().name)hi(); hi()

这将打印出:

Nice to meet you MainThreadWelcome back MainThread

一件很容易被忽略的重要事情:一个

threading.local()
对象只需要创建一次,而不是每个线程一次或每个函数调用一次。的
global
class
水平的理想地点。

这就是为什么:

threading.local()
每次调用它时都会实际上创建一个新实例(就像任何工厂或类调用一样),因此
threading.local()
多次调用会不断覆盖原始对象,这很可能不是您想要的。当任何线程访问现有
threadLocal
变量(或任何被调用的变量)时,它将获得该变量的私有视图。

这将无法正常工作:

import threadingfrom threading import current_threaddef wont_work():    threadLocal = threading.local() #oops, this creates a new dict each time!    initialized = getattr(threadLocal, 'initialized', None)    if initialized is None:        print("First time for", current_thread().name)        threadLocal.initialized = True    else:        print("Welcome back", current_thread().name)wont_work(); wont_work()

将产生以下输出:

First time for MainThreadFirst time for MainThread

多处理模块

因为

multiprocessing
模块为每个线程创建一个新进程,所以所有全局变量都是线程局部的。

考虑以下示例,其中

processed
计数器是线程本地存储的示例:

from multiprocessing import Poolfrom random import randomfrom time import sleepimport osprocessed=0def f(x):    sleep(random())    global processed    processed += 1    print("Processed by %s: %s" % (os.getpid(), processed))    return x*xif __name__ == '__main__':    pool = Pool(processes=4)    print(pool.map(f, range(10)))

它将输出如下内容:

Processed by 7636: 1Processed by 9144: 1Processed by 5252: 1Processed by 7636: 2Processed by 6248: 1Processed by 5252: 2Processed by 6248: 2Processed by 9144: 2Processed by 7636: 3Processed by 5252: 3[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

…当然,线程ID以及每个线程ID和每个命令的计数会因运行而异。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/640788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号