如何确定可使用的最大并发数:
由于在执行任务时,主程序会占用一个并发数,所以,可使用的最大并发数会小于账号的总并发个数。
账号如果是多人使用的,也要考虑到其他使用者,避免影响他人的使用。因此,需要结合用户自身情况,确定好可用的最大并发数。
注:如何查看当前账户的并发数,可参考
Q:任务管理说明中的info或ou命令的使用说明。
如何将任务分割成可网格执行的子程序:
可网格执行的子程序一般是相互独立的,与不依赖主程序,只需传入参数即可获取到对应的结果。
因此,子程序的封装可以从证券代码、日期时间或样本长度等维度出发。
比如下述提取全A股证券相关指标的范例,就是通过证券代码将任务进行分割的。
如何通过程序控制任务执行时的并发数:
通过指定最大并发数对程序的网格数进行控制。
下述范例中,通过指定的最大并发数,将证券代码集合进行分割。分割后的证券代码通过循环分发给并发任务;在最后一次循环中,并发任务已分发完成,主程序继续执行最后一部分任务。
需要注意,尽量避免频繁分发并发任务,会导致阻塞时间过长,影响效率。
下述是执行范例代码时,采用了不同的网格数进行计算所消耗的时间对比,仅供参考。
使用的网格数 | 取数完成消耗的时间(s)
|
---|
不使用网格 | 64.1135
|
2 | 38.7631
|
4 | 16.9317
|
8 | 10.7717
|
范例:
//获取全A股指定日期区间的多个指标
Function TSDN_BFDemo();
begin
bf:=4;//最大并发数
begt:=20210101t;
endt:=20210112t;
stocks:=getbk("A股");
sLen:=length(stocks);
n:=sLen div bf;//每个并发任务分配的证券个数
rt:=array();
ret:=array();
for i:=0 to bf-1 do
begin
if i<>bf-1 then
ret[i]:=#GetStocksDataByQK(stocks[n*i:n*(i+1)-1],begt,endt);
else
ret[i]:=GetStocksDataByQK(stocks[n*i:sLen-1],begt,endt);
end
for j in ret do
rt&=dupvalue(ret[j]);
return rt;
End;
//取指定日期区间多个股票的指标
Function GetStocksDataByQK(stocks,begt,endt)
begin
ov2:=BackupSystemParameters2();
setsysparam(pn_cycle(),cy_day()); //周期
data:=array();
n:=0;
for i:=0 to length(stocks)-1 do
begin
stock:=stocks[i];
setsysparam(pn_stock(),stock); //设置当前证券代码
dayList:=stocktradedayqk(begt,endt); //取当前证券的交易时间序列
for j:=0 to length(dayList)-1 do //时间循环
begin
dayEnd:=dayList[j];
setsysparam(pn_date(),dayEnd);//设置当前时间,给不需要时间参数的指标提供指定日
data[n]['StockID']:=stock;
data[n]['StockName']:=stockName(stock);
data[n]['Date']:=datetostr(dayEnd);
//获取多个指标值
data[n,'收盘价']:=close();
data[n,'成交量']:=vol();
data[n,'涨幅(%)']:=stockzf3();
data[n,'macd']:=MACD_MACD_v(12,26,9);
data[n,'ema_10']:=Ema_v(10);
//还可以继续添加其它指标
//data[k,'xxx']:=funcxxx(...);
n++;
end;
end
return data;
end
相关链接:
FAQ:
Q:天软网格计算
FAQ:
Q:网格计算时报错:Grid pending count exceed limited
FAQ:
Q:网格执行报错:Result return error,maybe size too large/gridcompute error
FAQ:
Q:网格执行的函数有什么要求?
FAQ:
Q:在网格中如何指定服务器进行运算