- 积分
- 3638
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
从某大神处借鉴了一个案例,能读懂,原地址:http://www.wingwy.com/archives/2013_08_1480.html
题设:a=b=findgen(10000,10000)+1,求total(a*b)+total(a/b)
程序分了2个线程同时计算total(a*b)和total(a/b)
代码与注解:
新建一个IDL_IDLBridge对象,用于第1个线程:
oBridge1 = OBJ_NEW('IDL_IDLBridge')
这个对象中新建属性a,b,c:
obridge1->setvar, 'a', findgen(10000,10000)+1
obridge1->setvar, 'b', findgen(10000,10000)+1
obridge1->setvar, 'c', findgen(10000,10000)+1
计算出c=total(a*b):
oBridge1->Execute,'c=total(a*b)',/nowait
输出状态status,布尔值,代表进程是否完结:
print,oBridge1->Status()
;可以看一下状态,运行的时候是1,证明返回主程序了
新建另一个IDL_IDLBridge对象及其属性,用于第2个线程:
oBridge2 = OBJ_NEW('IDL_IDLBridge')
obridge2->setvar, 'a', findgen(10000,10000)+1
obridge2->setvar, 'b', findgen(10000,10000)+1
obridge2->setvar, 'd', findgen(10000,10000)+1
计算出d:
oBridge2->Execute,'d=total(a/b)',/nowait
看线程状态:
print,oBridge2->Status()
;看看实时状态,电脑不逆天的话也应该是1
两个线程都停了才合并计算,不然一直在这里循环不进:
while ((oBridge1->Status() EQ 1) or (oBridge2->Status() EQ 1)) do begin
endwhile
输出状态(不太理解为什么要输出):
print,oBridge1->Status()
print,oBridge2->Status()
;确认一下状态为0,表示两进程都算完了
;我推测,status=1表示正在运行,0表示没在运行
传递参数:
c1=oBridge1->GetVar('c')
c2=oBridge2->GetVar('d')
销毁对象,腾出内存:
obj_destroy, obridge1
obj_destroy, obridge2
合并结果:
result=c1+c2
附件中也放了程序,与原作程序有所差别,根据自己的理解改的
我用tic-toc输出运行时间,很失落:
% Time elapsed: 6.2630000 seconds.
我直接计算之:
a=findgen(10000,10000)+1
b=findgen(10000,10000)+1
c=findgen(10000,10000)+1
d=findgen(10000,10000)+1
c=total(a*b)
d=total(a/b)
print,c+d
运行时间:
% Time elapsed: 1.1980002 seconds.
多线程居然慢很多!我擦~
|
|