以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]多线程的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=131084)

--  作者:chnfo
--  发布时间:2019/2/15 21:36:00
--  [求助]多线程的问题
看到高级开发指南中的多线程,想起以前做的一个功能(只是类比举例,不代表真实应用,真实的计算模型比下面的例子复杂很多,而且数据量很大)
例如要展示商品的年度进货量、季度进货量、月进货量。
以前是按顺序计算年度、季度、月进货量,然后展现在界面表中,在数据量大的时候,耗时较长。

如果是多线程,是否可以同时开启三个线程来分别计算之后,再将结果合并到一个表中,然后展现到界面表中,这样耗时应当会减少一些。

那么,如果这样应用,要注意什么问题?
[此贴子已经被作者于2019/2/15 21:39:09编辑过]

--  作者:zhy400137
--  发布时间:2019/2/15 21:50:00
--  
mark
--  作者:有点蓝
--  发布时间:2019/2/15 21:52:00
--  
看:http://www.foxtable.com/mobilehelp/scr/277.htm

可以同时开12个线程,分别计算一个月的数据;或开4个线程,计算4个季度的数据

--  作者:chnfo
--  发布时间:2019/2/15 22:20:00
--  
蓝兄误解我的意思了。
假如说现在是11月份。
我想知道的是各种商品的三个数字。一是年度累计(也就是1-11月的),二是第4季度(10-11月),三是月(单指11月的)

这时候就很难用for each 去开三个线程了。
如果要缩短计算时间,该如何处理?

直接这样?

Functions.AsyncExecute("年度累计")

Functions.AsyncExecute("季度累计")

Functions.AsyncExecute("月度累计")
[此贴子已经被作者于2019/2/15 22:26:08编辑过]

--  作者:有点蓝
--  发布时间:2019/2/15 22:26:00
--  
就是这个意思。

如果数据量比较大,1-11月每月一个线程同时进行统计,全部统计后再加总,第4季度就是10-11月这2个月的计算结果汇总

如果数据量相对较小,按季度开线程计算即可

--  作者:chnfo
--  发布时间:2019/2/15 22:31:00
--  
其实真实数据,并不是因为月份多,而是因为品类多(4万行)。
然后还有一些比较复杂的计算导致的。


--  作者:有点蓝
--  发布时间:2019/2/15 22:40:00
--  
原理都是一样的啊,不管是按月,或是按品类、品牌。供应商....目的其实就是把把数据分成可以独立计算的小单位,放到线程里计算,然后再汇总。比如每1000个品类一个线程、某个供应商的品类一个线程、......

也可以每个月初把上个月的数据统计出来,把结果记录到表中,以后直接取计算结果,不需要每次都重新统计一次.........

方法有很多,达到目的就行,至于这个方法能不能用,试过才知道

--  作者:chnfo
--  发布时间:2019/2/16 11:35:00
--  
比如每1000个品类一个线程、某个供应商的品类一个线程、......


如果要这样应用,全局变量、同步函数、异步函数该如何定义?这一块不是很好理解。

--  作者:有点蓝
--  发布时间:2019/2/16 12:15:00
--  
具体问题具体分析。如果如果这些品类都是各自计算,和其他品类没有交互,不需要什么全局变量、同步函数,直接计算把结果写入数据库即可。

如果是按月份计算,然后需要汇总,看看这个:http://www.foxtable.com/mobilehelp/scr/3270.htm,原理一样的

--  作者:chnfo
--  发布时间:2019/2/16 15:51:00
--  
如附件所示(只是类比方法,删除了很多数据)。
Tbgoods是商品分类,TBRK是库存数据。
目的是要获得当前日期所在年度的数量、金额;季度的数量、金额;月份的数量、金额。

因为数据量可能比较大,类似的用多线程来应当怎么做呢?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:多线程处理数据.zip