【问题标题】:Calling database handler class in a python thread在 python 线程中调用数据库处理程序类
【发布时间】:2018-05-23 20:49:52
【问题描述】:

我正在编写一些服务器代码,它的 MQTT 端使用线程模块在它自己的线程中运行,该模块运行良好且没有问题,但现在我想知道如何继续。

我有两个 MariaDB 数据库,其中一个是本地的,另一个是远程的(这是一个很好的利基原因。)我正在编写一个处理数据库的类。这个类将启动新的类线程,将数据提交到他们尊重的数据库。如果条件为真,则告诉数据启动一个新线程将数据推送到一个数据库,如果条件为假,数据将转到另一个数据库。 MQTT 线程有一个“Database handler”类的实例,并通过类内不同的调用函数将数据传递给它。

这是否可以让一个线程专注于 MQTT 任务,而另一个线程可以工作?还有其他线程,我以前从未将数据库和线程结合起来,所以我想从经验丰富的程序员那里获得帮助我的意见或任何信息。

【问题讨论】:

  • 你不能在两个不同的线程中使用相同的连接线程。
  • 那么在每个线程的开始处开始一个新的连接?

标签: python database multithreading mariadb


【解决方案1】:

编写“线程安全”的代码可能很棘手。我怀疑 MySQL 的 Python 连接器是否是线程安全的;几乎不需要它。

MySQL 很高兴有多个客户端连接。但它们必须是独立的连接,而不是在不同线程中运行的同一个连接。

很少有项目需要多线程访问数据库。你有特殊需要吗?如果是这样,让我们​​听听,并讨论“正确”的做法。

目前,您的每个线程需要与数据库通信 应该创建自己的连接。通常,这样的连接可以在启动线程(或进程)后不久创建并保持打开状态,直到接近线程结束。也就是说,通常每个线程应该只有一个连接。

【讨论】:

  • 我正在为物联网设备编写服务器软件,此代码从 MQTT 服务器获取信息,并将其放入数据库。后台发生了很多事情,代码连接到外部数据库,但是,如果数据库出现故障,脚本会记录到本地数据库,然后检测主数据库何时启动并自动恢复,就像什么都没发生一样。我只是对 MySQL/MariaDB 不是很有经验,所以有一点问题,但是 MQTT 线程必须分开并启动其他 DB 线程,因此数据的计算不会阻碍 MQTT 处理。
  • @SamuelArchibald - 在基于 Web 的应用程序中,每个用户连接(插入行、运行报告等)都是一个单独的线程,因此必然是一个到 MySQL 的单独连接。我不熟悉 MQTT;听起来好像工作方式不同?
  • 感谢您提供的信息,MQTT 是一种常见的物联网协议,它允许实体连接和验证,然后发布和订阅基于主题的系统。 (即发布到“devices/1”将使所有订阅该主题的设备或代码看到发布的消息)所以MQTT与数据库本身没有任何关系,我的代码充当MQTT和数据库之间的中间人并添加了许多额外的功能。
  • @SamuelArchibald - 好的,那么我需要更好地理解与 MySQL 交互的“客户端”。是你的 Python 代码吗?或者一些使用python的包? MQTT 是否通过“队列”发送内容,然后您的单个进程起作用?多线程在这里有什么好处?等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2015-12-10
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多