首页 > 其他分享 >flask之 scoped实现线程安全.py

flask之 scoped实现线程安全.py

时间:2025-01-15 18:10:26浏览次数:1  
标签:Session flask py --- session 线程 scoped local

1、用法

导入模块,将Session传入scoped_session即可

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()

  

标签:Session,flask,py,---,session,线程,scoped,local
From: https://www.cnblogs.com/dgp-zjz/p/18673567

相关文章

  • Python Playwright学习笔记(一)
    一、简介1.1Playwright是什么?它是微软在2020年初开源的新一代自动化测试工具,其功能和selenium类似,都可以驱动浏览器进行各种自动化操作。1.2、特点是什么支持当前所有的主流浏览器,包括chrome、edge、firefox、safari;支持跨平台多语言:支持Windows、Linux、macOS;安装和......
  • python 按时间戳删除32×32数组的前2列和后9列
    还是雨滴谱文件,这次尝试批量处理首先处理1个单独的txt文件#!usr/bin/envpython#-*-coding:utf-8_*-"""@author:Suyue@file:raindrop.py@time:2025/01/15{DAY}@desc:"""importnumpyasnpimportredefprocess_file(input_file,output_file):......
  • 美团动态线程池
    使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢?代码中创建了一个ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适凭经验设置参数值,上线后发现需要调整,改代码重启服务,非常麻烦线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题......
  • 第七届传智杯初赛第二场(abc三组)补题+题解python
    文章目录前言A计算商品打折结算金额(B组、C组)B茶杯和球(A组、C组)C游游的字母串(A组、B组、C组)D电梯(B组、C组)E小欧的排列计算(A组、B组、C组)F游游的字母子串(A组、B组、C组)G跳跳跳(A组、B组)H小红的战争棋盘(A组)前言在CSDN上并未找到第七届传智杯......
  • flask之sqlalchemy ORM 一对多、多对多
    一、一对多关系爱好和人的关系,一个爱好可以对应多个人1、models#1导入一些模块importdatetimefromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportdeclarative_base,\relationship#新的变成它,老的会有fromsqlalchemy.ext.declarativeimport......
  • 线程每次iodelay监控及D状态开始和结束监控并做堆栈记录
    一、背景在之前的博客 获取进程或线程级别的iodelay的方法_io验证延时链-CSDN博客里,我们讲到了获取进程或线程的iodelay的方法,但是博客里讲到的获取iodelay的值是一个累积值,并不能准确的捕获到每个单次的iodelay具体是多少。这篇博客里是为了监控每个单次的iodelay,除了监控i......
  • 2025-1-15-十大经典排序算法 C++与python
    文章目录十大经典排序算法比较排序1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序非比较排序8.计数排序9.桶排序10.基数排序十大经典排序算法十大经典排序算法可以分为比较排序和非比较排序:前者包括冒泡排序、选择排序、插......
  • Java多进程多线程处理详解
    在Java编程中,多进程和多线程是两种常见的并发编程技术,用于提高程序的执行效率和响应速度。本文将详细介绍Java中的多进程和多线程处理,包括理论概述和代码示例。通过本文,你将了解如何在Java中实现多进程和多线程,以及它们在实际应用中的价值和意义。一、理论概述1.多进程与多线程......
  • 【C语言】_字符串函数strcpy
    目录1. 函数声明及功能2.使用示例3.注意事项4. 模拟实现4.1第一版:基本功能+判空+const修饰4.2第二版:优化对于'\0'的单独拷贝4.3第三版:仿strcpy的char*返回值1. 函数声明及功能char*strcpy(char*destination,constchar*source); strcpy功能:字......
  • python毕业设计基于python的学生管理系统的设计
    一、项目技术开发语言:Pythonpython框架:Django软件版本:python3.7/python3.8数据库:mysql5.7或更高版本数据库工具:Navicat11开发软件:PyCharm/vscode前端框架:vue.js二、项目内容和项目介绍  ......