如何在使用线程/多处理时使用简单的sqlalchemy调用

2024-10-02 00:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

我正在编写一个程序,从语料库中读取一组文档(每行都是一个文档)。每个文档都使用一个函数processdocument进行处理,分配一个唯一的ID,然后写入数据库。理想情况下,我们希望使用几个过程来实现这一点。逻辑如下:

  1. 主例程创建一个新的数据库并设置一些表。在
  2. 主例程设置一组运行辅助函数的进程/线程。在
  3. 主例程启动所有进程。在
  4. 主例程读取语料库,将文档添加到队列中。在
  5. 每个进程的worker函数循环,从队列中读取文档,使用processdocument从中提取信息,并将信息写入数据库表中的新条目。在
  6. 一旦队列为空并且主例程设置了适当的标志(一旦没有更多的文档要添加到队列中),工作循环就会中断。在

问题

我对sqlalchemy(和数据库)比较陌生。据我所知,在主例程中用于设置数据库的代码运行良好。我陷入困境的地方是,我不确定在每个进程写入数据库而不与其他进程发生冲突的情况下,在worker函数中放入什么。在

没有什么特别复杂的事情发生:每个进程都会从多处理.值对象,由锁保护。我只是不确定是否应该将什么传递给worker函数(除了队列),如果有的话。我能通过吗sqlalchemy引擎我在主程序中创建的实例?元数据实例?我是否为每个流程创建一个新引擎?有没有其他规范的方法?有什么特别的事情需要我记住吗?在

其他评论

我很清楚,我可以不必为多处理而烦恼,而是在一个进程中完成这项工作,但我将不得不编写代码,在以后为数据库读取多个进程,所以我最好现在就想办法解决这个问题。在

提前感谢您的帮助!在


Tags: 实例函数文档引擎信息数据库sqlalchemy队列
1条回答
网友
1楼 · 发布于 2024-10-02 00:32:30

元数据及其表对象集合应该被视为应用程序的固定、不变的结构,这与函数和类定义没有什么不同。正如您所知道的,在分叉子进程时,应用程序的所有模块级结构仍然存在于进程边界之外,而表def通常属于此类。在

但是,引擎指的是DBAPI连接池,这些连接通常是TCP/IP连接,有时是文件句柄。DBAPI连接本身通常不能在子进程边界上移植,因此您需要为每个子进程创建一个新的引擎,或者使用一个非池引擎,这意味着您使用的是NullPool。在

您也不应该将元数据与引擎进行任何类型的关联,即“绑定”元数据。这种做法虽然在各种过时的教程和博客文章中很突出,但实际上并不是一个通用的东西,我尽量不强调这种工作方式。在

如果您正在使用ORM,“程序结构/活动工作”也存在类似的二分法,其中映射的类当然是在所有子进程之间共享的,但您肯定希望会话对象是特定子进程的本地对象-这些对象对应于实际的DBAPI连接以及其他许多可变状态,这是最好的保留在一个操作的本地。在

相关问题 更多 >

    热门问题