gpt4 book ai didi

multithreading - 优美完整的应用程序

转载 作者:行者123 更新时间:2023-12-03 12:55:30 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的程序来从std中提取行,对其进行解析,然后为每行将一条记录插入到postgres数据库中。为了测试,我一直在仅使用cat my_file | java ...的文件上运行它

这是代码:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.io.Source
import scala.util.Failure
import scala.util.Success
import slick.driver.PostgresDriver.api._

object LoadToDB extends App {

val db = Database.forConfig("dev-ingest")

for (line <- Source.fromInputStream(System.in).getLines()) {
val record = parse(line)
val insert = TableQuery[MyTable] += record
val fut = db.run(insert)

fut onComplete {
case Success(x) => {
System.out.println("Inserted one record: " + record)
}
case Failure(e) => {
e.printStackTrace()
}
}

}
}

从理论上讲,文件中的行数,打印的“插入一条记录”语句的数目以及数据库中的记录数应全部匹配。但是,它们都是不同的。文件中的行比数据库中的记录多,并且数据库中的记录比打印的“插入”语句更多。

我对scala/slick的异步执行模型有点陌生,所以我怀疑我在那儿做错了什么。也许当主线程结束时,其余所有线程都没有机会完成其执行?有什么办法说“等待所有提交的任务完成”吗?我尝试了 Await.result(db.shutdown(), Duration.Inf),但这似乎阻止了任务运行到完成,只是杀死了它可以立即执行的任务。

最佳答案

您的程序在 future 完成之前退出。您必须在某个地方阻止它们。

关于multithreading - 优美完整的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com