爬虫之数据神器4---Peewee事务管理和连接池用法

前言:

继续上一章节:爬虫之数据神器3---Peewee模型定义详解-CSDN博客

事务管理和连接池的重要性

事务管理和连接池是在开发和维护数据库应用程序时非常重要的概念和技术。

  1. 事务管理:事务是指作为一个逻辑单元执行的一系列数据库操作。事务具有原子性、一致性、隔离性和持久性(ACID)的特性。事务管理用于确保在多个数据库操作中的一致性和完整性,并能够正确处理并发访问和异常情况。通过使用事务管理,可以确保在操作失败或异常情况下,数据库保持一致状态,并能够撤消已执行的操作,以防止数据损坏或丢失。

  2. 连接池:在许多应用程序中同时与数据库建立和管理大量的数据库连接是低效和昂贵的。连接池提供了一种重用和管理数据库连接的机制,以避免频繁地创建和销毁连接。连接池可以提高数据库应用程序的性能和可扩展性,减少资源消耗,提高响应速度。

        对于Peewee用户,了解和正确使用事务管理和连接池是极其重要的,因为它们能够保证数据库操作的可靠性、并发性和效率。


正文:

1. Peewee事务

A. 什么是事务?

        事务是作为一个逻辑单元执行的一系列数据库操作的集合。它们具有原子性、一致性、隔离性和持久性的特性,通常简称为ACID特性。

  1. 原子性(Atomicity)确保事务中的所有操作要么全部成功,要么全部失败。如果任何一个操作失败,整个事务将被回滚到起始点,以保持数据的一致性。
  2. 一致性(Consistency)确保在事务开始之前和之后,数据库中的数据保持一致状态。这意味着在一个事务中对数据的任何修改都必须满足数据库的约束和规则。
  3. 隔离性(Isolation)确保在多个并发事务同时执行时,每个事务都被视为独立的。一个事务的操作不会被其他事务的操作所干扰,以避免数据的不一致和并发问题。
  4. 持久性(Durability)确保一旦事务成功提交,其结果将被永久保存且不可逆。即使在系统发生故障或崩溃时,已提交的事务对数据库状态也具有持久性影响。

B. 使用事务的好处

使用事务管理数据库操作有如下好处:

  1. 数据一致性:事务的原子性保证了一系列操作的一致性,所有操作要么全部成功,要么全部失败。

  2. 并发控制:事务的隔离性确保了并发执行的事务之间的数据不会相互干扰或破坏。

  3. 故障恢复:事务的持久性保证了一旦提交,事务的结果将被保存并能够在系统故障后进行恢复。

C. 在Peewee中启动事务

在Peewee中,启动一个事务非常简单。你可以使用database.atomic()装饰器或database.atomic()上下文管理器来创建一个事务。

with database.atomic() as transaction:# 在此处添加数据库操作

在上例中,database.atomic()上下文管理器将创建一个新的事务,并在退出上下文时自动提交或回滚事务。如果在上下文中的任何地方发生异常,事务将被回滚。

D. 提交和回滚事务

在Peewee中,事务的提交和回滚可以通过transaction.commit()transaction.rollback()方法来执行。这两个方法可以用于在事务期间根据特定条件进行显式提交或回滚。

with database.atomic() as transaction:# 在此处添加数据库操作if condition:transaction.commit()else:transaction.rollback()

E. 处理事务错误和异常

当在事务期间发生错误或异常时,Peewee提供了异常处理机制来处理事务错误。常见的Peewee事务异常包括peewee.DatabaseErrorpeewee.IntegrityError

try:with database.atomic() as transaction:# 在此处添加数据库操作
except peewee.DatabaseError as e:transaction.rollback()# 处理事务错误

在异常处理块中,你可以选择回滚事务和处理事务错误的方式,以确保数据的一致性。

通过使用Peewee提供的事务管理功能,你可以编写可靠、具有一致性的数据库操作,并在发生错误或异常时进行恢复和处理。使用事务可以保证数据的完整性和一致性,以及避免并发访问的问题。在Peewee中,事务的启动、提交和回滚都是非常简单的,并且异常处理机制能够帮助你处理事务期间可能遇到的错误和异常。


2.  Peewee连接池

A. 理解连接池

        在讨论Peewee连接池之前,先来理解什么是连接池。连接池是一种管理数据库连接的技术,它允许应用程序在需要时从连接池中获取数据库连接,而不是每次都创建新的连接。连接池可以显著提高性能和可扩展性,特别是在多线程或并发访问的情况下。

        连接池维护一组预先建立的数据库连接,这些连接在应用程序初始化或首次访问数据库时创建。应用程序可以从连接池中请求连接,并在使用完毕后将连接返回到池中。连接池负责管理连接的分配和回收,以便于其他请求可以重复使用已存在的连接。

B. 连接池的好处

使用连接池可以带来许多好处:

  1. 提高性能:连接池避免了为每个请求创建新的数据库连接的开销,从而减少了连接的建立和断开时间。这可以显著提高应用程序的性能。

  2. 提高可扩展性:通过重复使用已有的连接,连接池可以有效地支持多个并发请求,而不会因为创建过多的连接而耗尽系统资源。

  3. 控制连接资源:连接池可以限制同时活动的连接数量,从而避免对数据库服务器造成过大的负载。

C. 在Peewee中设置和配置连接池

Peewee是一个Python ORM(对象关系映射)库,它提供了对数据库的高级操作和查询。Peewee提供了对连接池的内置支持,并且使用连接池非常简单。

  • 安装Peewee:首先,确保已安装Peewee库。可以使用pip命令进行安装:
pip install peewee
  • 导入连接池:在代码中引入连接池相关的模块:
from playhouse.pool import PooledMySQLDatabase
  • 配置连接池:需要提供连接池的相应配置信息,例如数据库的主机名、端口号、用户名、密码等。可以通过创建一个连接池实例,并传递配置参数来配置连接池:
db = PooledMySQLDatabase('database_name',max_connections=8,stale_timeout=300,host='localhost',port=3306,user='username',password='password'
)

在上面的示例中,max_connections参数定义了连接池中的最大连接数,stale_timeout参数定义了连接在闲置多久后被认定为过期。

D. 管理和重用连接池中的连接

与传统的Peewee数据库连接不同,连接池使用了一种不同的方式获取和使用连接。在使用连接池时,不再需要显式地打开或关闭连接,而是通过上下文管理器来管理连接的获取和释放。

以下是使用Peewee连接池查询数据库的示例:

from peewee import *# 创建连接池
db = PooledMySQLDatabase('database_name', host='localhost', port=3306, user='username', password='password', max_connections=8, stale_timeout=300)class BaseModel(Model):class Meta:database = dbclass User(BaseModel):name = CharField()age = IntegerField()# 使用连接池进行查询
with db.connection_context():users = User.select().where(User.age > 18)for user in users:print(user.name)

db.connection_context()用作上下文管理器,确保在查询完成后连接被正确释放。

通过使用Peewee连接池,可以轻松管理和重用数据库连接,提高应用程序的性能和可扩展性。

小总结:

        Peewee连接池是一种管理数据库连接的技术,在需要时从连接池中获取连接,并在使用完毕后将连接返回到池中。它提供了提高性能、可扩展性和控制连接资源的好处。使用Peewee连接池的步骤包括导入连接池模块、配置连接池相关参数以及使用上下文管理器来管理连接的获取和释放。通过合理配置和使用Peewee连接池,可以优化数据库操作并改善应用程序的性能。

3. 使用事务和连接池的最佳实践

A. 有效使用事务

事务是一组数据库操作,作为一个不可分割的工作单元执行。在使用事务时,有几个最佳实践可以帮助提高数据库操作的效率和可靠性。

  1. 将相关的数据库操作包装在单个事务中:将相关的数据库操作(例如插入、更新、删除等)包装在单个事务中可以确保这些操作要么全部成功执行,要么全部回滚。这样可以保证数据的一致性,并减少错误的可能性。
from peewee import *# 假设存在一个 User 模型类
with db.atomic():  # 开始事务user = User.create(name='John', age=25)  # 执行数据库操作user.update(age=26)  # 执行其他数据库操作

在上面的示例中,db.atomic()用作上下文管理器,确保在事务中的所有数据库操作要么全部成功,要么全部回滚。

  • 在事务内处理复杂的操作:如果需要进行复杂的数据库操作,例如多个查询和更新操作的组合,最好将它们放在同一个事务中。这样可以确保这些操作以原子的方式执行,并避免数据的不一致。
with db.atomic():# 事务内的复杂操作# ...

在编写复杂操作时,务必要保证在事务内的每个操作都能正确处理,并在必要时回滚整个事务。

B. 优化连接池

连接池的配置和管理对于数据库应用程序的性能和可靠性至关重要。以下是一些优化连接池的最佳实践。

  • 配置池大小和超时时间:连接池的大小应根据应用程序的负载和数据库的处理能力进行适当配置。如果连接池过小,可能会导致请求被阻塞,而连接池过大则可能会浪费系统资源。类似地,超时时间也应该根据应用程序的需求进行调整,以确保连接不会保持过长时间而浪费资源。

在Peewee中,可以使用max_connections参数配置连接池的大小,使用stale_timeout参数配置连接的超时时间(闲置多久后被认定为过期)。

  • 监控和管理连接的使用:定期监控连接池的使用情况是确保连接池正常工作的关键。可以通过检查连接池的连接数、闲置连接的数量以及连接的平均使用时间等指标来评估连接池的健康状况。

对于长时间闲置的连接,可以考虑使用连接池提供的回收机制将其释放。这样可以防止过多的长时间闲置连接占用过多的资源,从而影响系统的性能。

此外,对于高负载的系统,使用连接池的队列机制可以帮助管理并发请求,并确保每个请求都能得到处理。

小总结:

在使用事务和连接池时,有几个最佳实践需要遵循。有效使用事务包括将相关操作放在单个事务中以确保操作的一致性,以及在事务内处理复杂的操作以避免数据不一致。在优化连接池方面,应根据应用程序的需求配置连接池的大小和超时时间,并定期监控和管理连接的使用情况。这些最佳实践可以帮助提高数据库操作的效率和可靠性,从而改善应用程序的性能。

4. 实际示例和用例

A. web应用程序中的事务管理

        在web应用程序中,事务管理是确保数据的一致性和完整性的重要环节。下面是一个示例,说明如何在web应用程序中有效地使用事务。

        假设我们有一个电子商务网站,用户可以下订单并将商品添加到购物车。在用户下单的过程中,需要进行多个数据库操作,例如创建订单、扣除库存等。为了保证这些操作原子地执行,可以使用事务管理。

from peewee import *db = MySQLDatabase('database_name', host='localhost', port=3306, user='username', password='password')class BaseModel(Model):class Meta:database = dbclass Order(BaseModel):order_number = CharField(unique=True)# ...class Product(BaseModel):name = CharField(unique=True)stock = IntegerField()# 在web应用程序中的处理订单逻辑
def process_order(order_data):with db.atomic() as txn:try:# 创建订单order = Order.create(order_number=order_data['order_number'])# 扣除库存for item in order_data['items']:product = Product.get(Product.name == item['name'])if product.stock < item['quantity']:raise Exception('Insufficient stock')product.stock -= item['quantity']product.save()# 其他数据库操作...txn.commit()  # 提交事务except Exception as e:txn.rollback()  # 回滚事务raise e

在上面的示例中,db.atomic()用作上下文管理器,确保在事务中的所有数据库操作要么全部成功,要么全部回滚。如果任何操作失败,事务将被回滚并抛出异常。

B. 多线程应用程序中的连接池

在多线程应用程序中,连接池的使用非常重要,以确保线程安全和高效的数据库连接管理。下面是一个示例,说明如何在多线程应用程序中使用连接池。

from playhouse.pool import PooledMySQLDatabase
import threading# 创建全局连接池
db = PooledMySQLDatabase('database_name', host='localhost', port=3306, user='username', password='password', max_connections=8, stale_timeout=300)# 使用线程本地存储(Thread-local Storage)来存储连接
local = threading.local()# 获取当前线程的数据库连接
def get_connection():if not hasattr(local, 'connection') or local.connection.is_closed():local.connection = db.get_conn()return local.connection# 在多线程应用程序中的数据库操作
def thread_function():try:# 获取数据库连接db_conn = get_connection()# 在连接上执行数据库操作# ...finally:# 将连接返回到连接池if hasattr(local, 'connection') and not local.connection.is_closed():db.put_conn(local.connection)# 创建多个线程并执行数据库操作
threads = []
for _ in range(10):t = threading.Thread(target=thread_function)threads.append(t)t.start()# 等待线程完成
for t in threads:t.join()

在上面的示例中,我们使用了连接池来创建全局的数据库连接,并使用线程本地存储(Thread-local Storage)来存储每个线程的连接。这样,每个线程都可以独立地获取和使用数据库连接,并在使用完毕后将连接返回到连接池。

C. 使用事务处理并发数据库更新

在并发环境中,多个用户同时对数据库进行更新可能导致数据的不一致性。事务的使用可以解决这个问题,并确保并发更新的一致性。下面是一个示例,说明如何使用事务处理并发数据库更新。

from peewee import *db = MySQLDatabase('database_name', host='localhost', port=3306, user='username', password='password')class BaseModel(Model):class Meta:database = dbclass Product(BaseModel):name = CharField(unique=True)stock = IntegerField()# 在并发环境中处理库存更新
def update_stock(product_id, quantity):with db.atomic() as txn:try:product = Product.select().where(Product.id == product_id).first()if product.stock >= quantity:product.stock -= quantityproduct.save()txn.commit()return Trueelse:return Falseexcept Exception as e:txn.rollback()raise e

在上面的示例中,我们使用了数据库事务来处理并发的库存更新操作。通过使用事务,可以确保每个更新操作在原子的环境下执行,并避免了并发更新导致的数据不一致问题。

小总结:

        在实际应用中,我们可以通过事务管理来确保数据库操作的一致性和完整性。在web应用程序中,事务管理可以用于处理复杂的操作,并确保这些操作要么全部成功,要么全部回滚。在多线程应用程序中,连接池的使用非常关键,以确保线程安全和高效的数据库连接管理。使用连接池和线程本地存储可以实现每个线程独立地获取和使用数据库连接。最后,使用事务处理并发数据库更新可以确保并发操作的一致性,并避免数据的不一致问题。以上实际示例和用例展示了在web应用程序、多线程应用程序和并发数据库更新中使用事务和连接池的最佳实践。

总结:

A. 总结事务管理和连接池的重要性

        事务管理和连接池是在数据库操作中非常重要的概念。事务管理确保了数据的一致性和可靠性,而连接池则提高了数据库操作的效率和性能。

        事务管理是指将一系列数据库操作作为一个不可分割的工作单元来处理。在事务中,要么所有的操作都成功执行,要么如果发生错误,所有的操作都会被回滚到事务开始之前的状态。这确保了数据的完整性,避免了数据被部分更新的情况发生。

        连接池是一组预先创建的数据库连接,用于处理并发的数据库操作。它可以避免每次数据库操作都要创建新的连接的开销,提高了数据库操作的效率。连接池中的连接可以被多个线程共享,从而减少了连接的竞争和排队时间。

使用事务管理和连接池的好处包括:

  1. 数据的一致性:事务管理确保了数据的一致性,避免了数据被部分更新或不一致的情况发生。

  2. 可靠性:事务管理可以回滚操作,即使发生错误,也可以保证数据的完整性,避免数据的丢失或损坏。

  3. 效率和性能:连接池减少了数据库连接的创建和销毁的开销,提高了数据库操作的效率和性能。

  4. 并发处理:连接池支持多个线程共享连接,减少了连接的竞争和排队时间,提高了并发处理能力。

B. 使用Peewee进行数据库操作时的关键要点和注意事项

Peewee是一个简单而强大的Python ORM(对象关系映射)库,用于方便地进行数据库操作。以下是使用Peewee进行数据库操作时的关键要点和注意事项:

  1. 安装和导入Peewee:首先,需要安装Peewee库。可以使用pip命令来安装:pip install peewee。然后,在代码中导入Peewee库:import peewee

  2. 连接到数据库:在使用Peewee之前,需要建立与数据库的连接。使用peewee.SqliteDatabase类可以连接到SQLite数据库。对于其他类型的数据库,可以使用相应的peewee.Database子类。例如,连接到MySQL数据库可以使用peewee.MySQLDatabase

  3. 定义模型:在Peewee中,数据库的表通过定义模型来表示。模型通常是一个继承自peewee.Model的Python类。在模型中,可以定义表的字段和其他的数据库操作。

  4. 创建表:在使用模型之前,需要创建相应的表。可以使用模型的create_table()方法来创建表。例如:User.create_table()

  5. 执行查询:使用Peewee可以进行各种类型的查询操作,如插入、更新、删除和查询等。可以使用模型的各种方法来执行这些查询操作。例如,使用User.select()查询所有的用户。

  6. 过滤查询:可以使用where()方法对查询结果进行过滤。例如,User.select().where(User.username == 'john')将返回用户名为'john'的用户。

  7. 排序查询:可以使用order_by()方法对查询结果进行排序。例如,User.select().order_by(User.username)将按照用户名的字母顺序对用户进行排序。

  8. 更新记录:可以使用update()方法来更新数据库中的记录。例如,User.update(username='new_username').where(User.id == 1).execute()将更新ID为1的用户的用户名。

  9. 删除记录:可以使用delete_instance()方法来删除数据库中的记录。例如,User.delete_instance()将删除所有的用户记录。

  10. 事务管理:Peewee提供了事务管理的支持。可以使用database.atomic()上下文管理器来处理事务。例如,可以使用with database.atomic():来开始一个事务。

  11. 错误处理:在使用Peewee进行数据库操作时,可能会出现各种错误。为了保证程序的稳定性,应该适当处理这些错误,例如使用异常处理机制进行错误捕获和处理。

这些是使用Peewee进行数据库操作时的一些关键要点和注意事项。掌握了这些要点,可以更加方便和有效地使用Peewee进行数据库操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理ASIC设计方法 笔记13 图像旋转ASIC的输入输出电路

文章目录 1 DPRAM:双端口 RAM2 IDT Integrated Device Technology, Inc. 公司介绍3 IDT70T633S10DDI4 TMS320C64145 旋转ASIC的输入输出框图图像旋转ASIC的输入输出电路案例用到的芯片相关介绍如下。 1 DPRAM:双端口 RAM DPRAM 的特点是可以通过两个端口同时访问,具有两套完全…

数据结构入门系列-栈的结构及栈的实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一段进行插入和删除元素操作&#xff0c;进行数据输入和删除操作的一端称为栈顶&#xff0c;另…

如何在TestNG中获取运行时的测试用例细节?

这篇文章将讨论如何在运行时获取测试用例的细节。我们可能在不同的场景中需要这些信息&#xff0c;比如创建定制的报告或者开发一个实时跟踪系统来监视测试用例的进度。 让我们从使用TestNG运行测试套件开始开始。然后&#xff0c;我们将尝试检索每个测试用例的细节&#xff0…

【授时防火墙】GPS北斗卫星授时信号安全防护装置系统

【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 1、装置概述 卫星信号安全防护装置&#xff08;以下简称“防护装置”&#xff09;是一款专门针对卫星导航授时安全的设备。该设备能接收 BD 系统和 GPS 系统卫星信号&am…

InternLM2-Chat-1.8B 模型测试

在interStudio进行InternLM2-Chat-1.8B模型访问&#xff0c;进入开发机后 配置基础环境 新建conda环境并且进入 conda create -n demo python3.10 -y conda activate demo 下载pytorch等相关包 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.…

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…

四、MySQL读写分离之MyCAT

一、读写分离概述 1、什么是读写分离&#xff1a; 读写分离&#xff1a;就是将读写操作分发到不同的服务器&#xff0c;读操作分发到对应的服务器 &#xff08;slave&#xff09;&#xff0c;写操作分发到对应的服务器&#xff08;master&#xff09; ① M-S (主从) 架构下&…

Java设计模式:外观模式之优雅门面(九)

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在软件工程中&#xff0c;设计模式是解决常见设计问题的经验总结&#xff0c;它为开发者提供了一种通用的、可复用的解决方案。外…

书生浦语训练营2期-第二节课笔记作业

目录 一、前置准备 1.1 电脑操作系统&#xff1a;windows 11 1.2 前置服务安装&#xff08;避免访问127.0.0.1被拒绝&#xff09; 1.2.1 iis安装并重启 1.2.2 openssh安装 1.2.3 openssh服务更改为自动模式 1.2.4 书生浦语平台 ssh配置 1.3 补充&#xff08;前置服务ok…

Thread的基本用法

目录 正文&#xff1a; 1.线程创建 2.线程休眠 3.获取线程实例 4.线程中断 5.线程等待join() 总结&#xff1a; 正文&#xff1a; 1.线程创建 线程创建是多线程编程的第一步&#xff0c;它涉及到创建一个可以并行执行的新线程。在Java中&#xff0c;有几种不同的方法可…

【Laravel】08 RESTful风格

【Laravel】08 视图模板动态渲染数据 1. RESTful风格 1. RESTful风格 (base) ➜ example-app php artisan make:model Blog -mc Model created successfully. Created Migration: 2024_04_01_143040_create_blogs_table Controller created successfully.(base) ➜ example-…

深入理解微信小程序的自定义组件模型

微信小程序作为一个独立的应用开发平台,提供了丰富的组件库供开发者使用。但在某些复杂的业务场景下,我们需要根据自身的需求来定制化组件。小程序为我们提供了自定义组件的能力,让我们可以更灵活地构建应用界面。 如果对微信小程序自定义组件还不太清楚的&#xff0c;请参考 …

简述JMeter实现分布式并发及操作

为什么要分布式并发&#xff1f; JMeter性能实践过程中&#xff0c;一旦进行高并发操作时就会出现以下尴尬场景&#xff0c;JMeter客户端卡死、请求错误或是超时等&#xff0c;导致很难得出准确的性能测试结论。 目前知道的有两个方法可以解决JMeter支撑高并发&#xff1a; …

pta 1036 跟奥巴马一起编程

1036 跟奥巴马一起编程 分数 15 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启…

阿里 对象存储OSS 云存储服务

1.简介 对象存储服务(Object Storage Service ,OSS) 是一种 海量、安全、低成本、高可靠的云存储服务&#xff0c;适合存放任意类型的文件。容量和处理能力弹性扩展&#xff0c;多种存储类型供选择&#xff0c;全面优化存储成本。 2.如何使用。参考文档 看文档&#xff0c;说的…

【python从入门到精通】-- 第四战:语句汇总

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

数据库安装的一些内容

这两天在研究整理上课数据库和web要求安装操作的软件 晚点再写下去 1.SQL server 2012 安装的过程中出现不少问题&#xff0c;根据网上的教程以及老师发的实验指导书首先安装SQL server (1)在安装规则检测之后&#xff0c;没有按照步骤进入下一步——设置角色&#xff1b; …

docker从入门到熟悉

一、什么是docker&#xff1f; Docker是一个用于开发&#xff0c;交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。借助Docker&#xff0c;您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付…

GPT3, llama2, InternLM2技术报告对比

GPT3&#xff08;September 22, 2020&#xff09;是大语言应用的一个milestone级别的作品&#xff0c;Llama2&#xff08;February 2023&#xff09;则是目前开源大模型中最有影响力的作品&#xff0c;InternLM2&#xff08;2023.09.20&#xff09;则是中文比较有影响力的作品。…

Linux文件搜索工具(gnome-search-tool)

opensuse下安装: sudo zypper install gnome-search-tool 操作界面: