查询完成后强制终止 q 会话

Jej*_*ort -1 python asynchronous synchronous kdb qpython

我试图在查询完成后强制终止(而不是关闭)aq 会话,以节省计算机上的资源。

目前它正在使用:

conn.sendAsync("exit 0")

问题是,如果我在它之后再次运行查询(尝试重新打开连接并运行另一个查询),它可能会失败,因为之前的连接仍会被终止asynchronous

因此,我尝试对synchronous查询执行相同的操作,但在尝试时:

conn.sendSync("exit 0")

我得到:

ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
python-BaseException
Run Code Online (Sandbox Code Playgroud)

我可以指定一个超时,以便 q 会话在 10 秒后自动终止,或者也许还有另一种方法来强制终止 q 会话?

我的代码如下所示:

conn = qc.QConnection(host='localhost', port=12345, timeout=10000)
conn.open()
res = None
try:
    res = conn.sendSync(query, numpy_temporals=True)
except Exception as e:
    print(f'Error running {query}: {e}')
conn.sendSync("exit 0")
conn.close()
Run Code Online (Sandbox Code Playgroud)

小智 7

我建议我们退后一步,重新评估在 Python 程序运行查询后终止 KDB 进程是否真的是正确的事情。如果程序不负责启动 KDB 进程,那么很可能它不应该关闭该进程。

考虑到节省资源的理由,我相信它会在内存中保存许多数据,因此需要时间来启动。它增加了另一个原因,如果你需要第二次使用它,你不应该杀死它。

  • 我同意这一点,如果您的资源非常紧张,需要不断终止并重新启动 kdb 实例,那么您就会遇到更大的问题。获得更多的内存,这比您为避免它而付出的努力要便宜。 (4认同)

Mat*_*ore 6

您不应该终止想要再次查询的 kdb 进程。关于您问题中的几点建议:

once my query is done to save resources-> 您可以手动调用垃圾收集来.Q.gc[]释放内存,或者更好地启用立即垃圾收集-g 1启动时启用立即垃圾收集。请注意,如果您在查询中创建大型全局变量,则该内存将不会被释放/返回。

https://code.kx.com/q/ref/dotq/#qgc-garbage-collect

https://code.kx.com/q/basics/syscmds/#g-garbage-collection-mode

killed automatically after say 10 seconds-> 如果您的目的是不允许客户端查询(例如来自 python 进程的查询)运行超过 10 秒,您可以-T 10在启动时或在进程运行时使用\T 10/设置查询超时system "T 10"

https://code.kx.com/q/basics/cmdline/#-t-timeout