基于作用域_会话实现线程安全
一、基于scoped_session实现线程安全
来自sqlalchemy.orm导入sessionmaker
从sqlalchemy导入创建引擎
从sqlalchemy.orm导入作用域会话
从模型导入用户
engine=create _ engine(' MySQL pymysql ://root :123 @ 127。0 .0 .1:3306/db _ flask ',max_overflow=0,pool_size=5)
会话=会话创建者(绑定=引擎)
'''
# 线程安全,基于本地线程实现每个线程用同一个会议
# 特殊的:作用域_会话中有原来方法的会议中的一下方法:
public_methods=(
__包含“__”、“__iter__”、“add”、“add_all”、“begin”、“begin_nested”,
关闭','提交','连接','删除','执行','过期,
expire_all ',' expect ge ',' expect ge _ all ',' flush ',' get_bind ',
is_modified ',' bulk_save_objects ',' bulk_insert_mappings ',
批量_更新_映射,
合并','查询','刷新','回滚,
"标量"
)
'''
#作用域_会话类并没有继承会话,但是却又它的所有方法
会话=作用域_会话(会话)
# ############# 执行ORM操作#############
obj1=用户(名称='randy ')
session.add(obj1)
# 提交事务
session.commit()
# 关闭会议
session.close()
二、底层实现原理
2.1作用域_会话进入类
从sqlalchemy.orm导入作用域会话
会话=作用域_会话(会话)
用于会话中的方法public_methods:
setattr(scoped_session,方法,仪器(方法))
public_methods=(
__包含_ _ ',
__iter__ ',
添加,
add_all ',
开始,
begin_nested ',
关闭,
提交,
连接,
删除,
执行,
过期,
expire_all ',
删除,
'全部删除,
齐平,
get_bind ',
is_modified ',
bulk_save_objects ',
大容量插入映射,
批量_更新_映射,
合并,
查询,
刷新,
回滚,
标量,
)
首先进入点击作用域_会话进入作用域_会话类查看如下内容
用于会话中的方法public_methods:
setattr(scoped_session,方法,仪器(方法))
为scoped_sesion类设置属性
公共方法中内容:
这是在会议类中的内容
public_methods=(
__包含_ _ ',
__iter__ ',
添加,
add_all ',
开始,
begin_nested ',
关闭,
提交,
连接,
删除,
执行,
过期,
expire_all ',
删除,
'全部删除,
齐平,
get_bind ',
is_modified ',
bulk_save_objects ',
大容量插入映射,
批量_更新_映射,
合并,
查询,
刷新,
回滚,
标量,
)
setattr(scoped_session,方法,仪器(方法))这句中的工具是一个闭包函数
改闭包函数中实现了对数据库中具体操作
self.registry()中实现如下,为其实现了一个线程
类作用域_会话(对象):
会话工厂=无
def __init__(self,session_factory,scopefunc=None):
自我。会话工厂=会话工厂
if scopefunc:
自我。registry=ScopedRegistry(session _ factory,scopefunc)
else:
自我。注册表=线程本地注册表(会话工厂)
线程内容如下,最终利用线程中的本地()模块中实现线程的安全,也就是操作数据的安全:
类threadlocalregistry(ScopedRegistry):
def __init__(self,createfunc):
self.createfunc=createfunc
self.registry=threading.local()
总结:
会话=作用域_会话(会话)这个会议是那一个操作过来就是哪一个操作,只操作自己对数据的操作,从而保证了线程的安全
在当下的阶段,必将由程序员来主导,甚至比以往更甚。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/74733.html