kdb - 在不同进程中运行函数

时间:2018-06-15 15:03:45

标签: 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]

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

此方法的替代方法可以是使用peach。如果你开始使用奴隶进行处理,那么你可以运行:

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

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

答案 1 :(得分:0)

我不知道为什么,但它适用于linux。

在Windows上,我尝试将f中的savelocation更改为Windows路径(使用\\而不是/),但这并没有帮助