首页 > 解决方案 > kdb - 在不同进程中运行函数

问题描述

我希望主 q 进程启动从属进程,为每个从属进程提供一个在输入列表上执行的函数。对于每个原子输入,该函数将下载一些数据(使用服务器句柄通过 IPC 在服务器上执行远程函数)并将输出表作为 csv 保存到磁盘。

srv:hopen `:server:port:user:pass
f:{[names;serverhandle]
      {[name;serverhandle]
        0N!"Processing ",string name;
        r:serverhandle(`.remotefunc;name);
        savelocation:"tmp/";
        (`$savelocation,(string name),".csv") 0: csv 0: r;
      }[;serverhandle] each names
  }[;srv];

我正在启动 3 q 从属进程:

handles:`u#`int$();
.z.pd:{n:abs system"s";$[n=count handles;handles;[hclose each handles;:handles::`u#hopen each mainport+1+til n]]}; 
.z.pc:{handles::`u#handles except x;}; 
startQs:{{value"\\q -p ",string[x]," -slave ",string[x-mainport]}each p:(value"\\p")+1+ til abs system"s"};

startQs[]; / starts slave q processes
.z.pd[];   / populates handles of slave q processes

然后我尝试在每个从属进程上执行f相同大小的批处理。names

neg[handles] @' (f),/:enlist each (3;0N) # `vincent`mia`jules`marsellus`butch`jimmie`honey;

所以
- 第一个从进程执行f-`vincent`mia`jules
第二个从进程执行f-`marsellus`butch`jimmie
第三个从进程f执行`honey

但是当我启动整个脚本时,q name-dl.q -s 3 -p 5012什么也没有发生(没有下载文件)。当我在f进程上手动执行时,它可以工作(例如)f[`vincent]

谢谢您的帮助

标签: kdb

解决方案


这种方法的替代方法是使用peach. 如果你启动你的从属进程,你可以运行:

f peach (3;0N) # `vincent`mia`jules`marsellus`butch`jimmie`honey

哪个应该在从属进程上运行每个命令。


推荐阅读