我正在用Tcl做实验,看看子进程是否可以在不阻塞主进程的情况下执行。
我想将dbws
命令和通道chan
传递给子进程,让它检索数据并将其写入通道,而不阻塞主进程。我意识到有一个-command
选项可以在后台执行此操作,但我想知道这是否可能出于其他原因。
你能告诉我是否有可能传递一个sqlite3命令给一个子进程,而不是打开一个新的连接到同一个数据库吗?我无法让子进程识别sqlite命令。
谢谢大家。
package require sqlite3
if { [catch {sqlite3 dbws -create $db_name false -readonly false} result] } {
chan puts stdout "result: $result"
exit
}
puts stdout "Return value of exectest.tcl is:\
[exec [info nameofexecutable] exectest.tcl dbws $chan]"
1条答案
按热度按时间wxclj1h51#
答案是一个简单的不。
SQLite库需要数据库的真实的文件名,以便访问回滚日志等内容;它不只是不解释地将名称传递给
open()
系统调用。即使在线程之间也不共享连接,这也是一个很好的实践;有些语言会这样做,但这不是一个好的计划。(特别是,在单个连接中同时从两个线程启动事务是非常糟糕的。SQLite的Tcl接口保持每个连接严格的解释器绑定(所有命令都是如此),这意味着被绑定到单个进程的单个线程。它根本不公开任何底层文件描述符,但即使公开了,使用它们也是一个非常糟糕的主意。让每个需要数据库连接的解释器打开它自己的数据库。或者将工作委托给单个线程(写繁重的工作负载最好这样做,并可能根据应用程序用例调整事务的工作方式)。