flask之 scoped实现线程安全.py
1.flask 之创建和运行2.flask之配置文件3.flask 路由、钩子函数4.flask之蓝图和前后端变量传递5.python之任务调度(APScheduler和schedule)6.flask之cbv、模版7.flask之请求对象、响应对象、cookies和session8.falsk之闪现、wtforms表单9.django、flask自定义命令10.flask 之信号(事件)、信号量(计数器、锁)11.flask之 sqlalchemy 原生操作和增删改查12.flask之sqlalchemy ORM 一对多、多对多
13.flask之 scoped实现线程安全.py
14.flask之 sqlalchemy 高级查询1、用法
导入模块,将Session传入scoped_session即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session from models import Users from threading import local engine = create_engine( "mysql+pymysql://root:lqz123?@127.0.0.1:3306/sqlalchemy01" , max_overflow = 0 , pool_size = 5 ) Session = sessionmaker(bind = engine) """ # 线程安全,基于本地线程实现每个线程用同一个session # 特殊的:scoped_session中有原来方法的Session中的一下方法: public_methods = ( '__contains__', '__iter__', 'add', 'add_all', 'begin', 'begin_nested', 'close', 'commit', 'connection', 'delete', 'execute', 'expire', 'expire_all', 'expunge', 'expunge_all', 'flush', 'get_bind', 'is_modified', 'bulk_save_objects', 'bulk_insert_mappings', 'bulk_update_mappings', 'merge', 'query', 'refresh', 'rollback', 'scalar' ) """ # session=Session() # 不是线程安全---》多线程并发情况下---》用的是同一个,就会出现混乱 #scoped_session类并没有继承Session,但是却又它的所有方法 # 以后在多线程,协程情况下,使用这个session,就没有并发安全的问题 # 原理是什么? 内部使用了threading包下local对象, local.session 在不同线程下执行这个取值或赋值,使用的都是当前线程自己的 # 线程1 local.a=100 后续的操作中--->取local.a--->永远是当时这条线程中放进去的a ,也就是100 # 线程2 local.a=999 --->取local.a--->永远是当时这条线程中放进去的a ,也就是999 #local对象如何实现的线程安全呢? 内部维护了一个字典,字典的key是线程id号,value值是 # l=local() # {} # # 线程1 # l.session=线程1的session # {线程1的id号:{session:新session}} # # # 线程2 # l.session# {线程1的id号:{session:新session},线程2的id号:{session:线程2的session}} # 本质就是,不同线程,使用自己线程的那个session # scoped_session 不是Session类的对象,但是他有 Session类对象的所有方法----》通过装饰器,装进去的 session = scoped_session(Session) # ############# 执行ORM操作 ############# obj1 = Users(name = "lqz4" ,email = '3533@qq.com' ) session.add(obj1) # 提交事务 session.commit() # 关闭session session.close() |
合集:
flask 框架