- 論壇徽章:
- 0
|
本帖最后由 aef25u 于 2020-05-30 13:53 編輯
簡介:
1、開啟各15個線程的1個生產者與2個消費者A、B(AB同為耗時任務)
2、生產者按條件通過2個Channel向A與B分別發送數據(數據不需按原始順序發送;按業務邏輯會發送不同數據,暫時按發送同一數據模擬)
3、數組@share為共享數據,消費者A、B會向其讀取數據(不需寫入或改變元素)
4、消費者A處理接收的數據,不符合業務邏輯的數據會繼續傳入B進行處理 if $v==999 {$supplierB.emit($v);}
問題:
1、這樣組織代碼有沒有不合理的地方?
2、共享的@share數組安不安全?
3、假如在消費者A、B中使用以下cached 函數,在各自不同線程下能起作用不?
use experimental :cached;
sub fun-name( $val1, $val2) is cached {...}
- my $TIME = now;
- my $supplierA = Supplier.new;
- my $channelA = $supplierA.Supply.Channel;
- my $supplierB = Supplier.new;
- my $channelB = $supplierB.Supply.Channel;
- my @share=("C","D");
- my $threads=15;
- my (@pA,@pB);
- for 1 .. $threads {
- @pA.push: start {
- react {
- whenever $channelA -> $v {
- if $v==999 {$supplierB.emit(1000);}#向消費者B發送數據,真實情況是發送$v
- say "channelA shareArr {@share[0]}:Thread {$*THREAD.id} got $v";
- }
- }
- }
- @pB.push: start {
- react {
- whenever $channelB -> $v {
- sleep 0.5;#真實代碼不需這一行,模擬單個B任務比A任務耗時
- say "channelB shareArr {@share[1]}:Thread {$*THREAD.id} got $v";
- }
- }
- }
- }
- my @promises;
- for ^1000 -> $r {
- push @promises, start {
- #sleep $r*0.001;
- sleep rand;
- $supplierA.emit($r);
- $supplierB.emit($r);
- };
- if @promises == 15 {
- await Promise.anyof(@promises);
- @promises .= grep({ !$_ });
- }
- }
- await @promises;
- $supplierA.done;
- await @pA;
- $supplierB.done;
- await @pB;
- $TIME = now - $TIME;
- say $TIME;
復制代碼
自已發現了個問題,要保證A處理完不符合業務邏輯的數據能傳到B不能這樣寫:
- $supplierA.done;
- $supplierB.done;
- await @pA,@pB;
復制代碼
|
|