我希望主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]
)
感谢您的帮助
答案 0 :(得分:2)
此方法的替代方法可以是使用peach
。如果你开始使用奴隶进行处理,那么你可以运行:
f peach (3;0N) # `vincent`mia`jules`marsellus`butch`jimmie`honey
哪个应该在从属进程上运行每个命令。
答案 1 :(得分:0)
我不知道为什么,但它适用于linux。
在Windows上,我尝试将f
中的savelocation更改为Windows路径(使用\\
而不是/
),但这并没有帮助