我写一个程序,读取了一组从语料库文件(每行一个文件)如何使用简单的SQLAlchemy电话。使用功能processdocument
处理每个文档,分配一个唯一的ID,然后写入数据库。理想情况下,我们希望使用多个流程来完成此操作。逻辑如下:
- 主例程创建一个新的数据库并设置一些表。
- 主例程设置一组进程/线程将运行一个辅助函数。
- 主例程启动所有进程。
- 主例程读取语料库,将文档添加到队列中。
- 每个进程的工作函数循环,从队列中读取文档,使用
processdocument
从中提取信息,并将信息写入数据库表中的新条目。 - 一旦队列为空并且主例程设置了相应的标志(一旦没有更多文档添加到队列中),工作程序就会中断。
问题
我是比较新的SQLAlchemy的(和数据库一般)。我认为用于在主例程中设置数据库的代码工作正常,从我可以告诉的。我被卡住的地方是我不确定如何将每个进程的工作者函数写入数据库而不与其他人冲突。
没有什么特别复杂的事情发生:每个进程都获得一个唯一的值,以便从受Lock保护的multiprocessing.Value对象分配给一个条目。如果有的话,我只是不确定是否应该传递给工作函数(除队列外)。我是否会传递我在主例程中创建的sqlalchemy.Engine实例?元数据实例?我是否为每个流程创建一个新的引擎?有没有其他规范的方式来做到这一点?我需要记住一些特别的东西吗?
附加评论
我很清楚我能不能与多费心,但在一个单一的过程中做到这一点,但我会写出具有几个进程读取数据库后代码在,所以我不妨想出如何做到这一点。
在此先感谢您的帮助!
您可能想要提到的是,在OP决定使用线程而不是进程的情况下,会话对象不是线程安全的。整个“提交”操作很大程度上取决于在提交期间对象是不可变的。 – patrys
感谢您的回复,但您可能需要更详细地解释此问题。让我们假装,为了争辩,我真的很愚蠢,不明白这里使用的大部分词汇......我不知道我是否正确理解这一点:我不需要做任何特别的事情所有?不要将Table实例作为参数传递给worker函数,只需添加并提交即可? –
我没有使用ORM,因为我还没有真正想出详细的工作方式(对于所有这些都很新颖),但是我可能需要,因为我基本上正在处理两个表格,并且在ManytoMany关系中有行。这需要使用ORM,对吧? –