因此,我在这里有一个玩具示例,其中我创建了200个角色,然后在发送最后100个角色之前发送一个"first"消息。
open System
open Akka.Actor
open Akka.Configuration
open Akka.FSharp
let system = System.create "test" (Configuration.defaultConfig())
let myActor (mailbox: Actor<_>) =
actor {
let rand = System.Random()
let! message = mailbox.Receive ()
match message with
| "first" -> printfn "first group"
| _ -> printfn "second group"
Thread.SpinWait (rand.Next(100,1000))
}
let actorArray = Array.create 200 (spawn system "myActor" myActor)
{0..199} |> Seq.iter (fun a ->
actorArray.[a] <- spawn system (string a) myActor
)
// First group
{0..100} |> Seq.iter(fun a ->
actorArray.[a] <! "first"
()
)
// Second group
{101..199} |> Seq.iter(fun a ->
actorArray.[a] <! "second"
()
)我希望前100个参与者在向第二组发送消息之前完成(即打印和终止),这是不会发生的。
我已经开始研究Akka's F# monitoring模块了,但我不太确定如何实现它。
发布于 2016-04-21 05:07:44
所以我已经创建了一个解决方案,不确定它是否是最常用的,但它可以完成工作!
open System
open Akka.Actor
open Akka.Configuration
open Akka.FSharp
let system = System.create "MySystem" (Configuration.defaultConfig())
let myActor (mailbox: Actor<_>) =
actor {
let rand = System.Random()
let! message = mailbox.Receive()
let sender = mailbox.Sender()
match message with
| "first" -> printfn "first group"
| _ -> printfn "second group"
Thread.SpinWait (rand.Next(100,1000))
sender <! "Done"
}
let myMonitor (mailbox: Actor<_>) =
let mutable i = 99
let actorArray = Array.create 200 (spawn system "myActor" myActor)
{0..199} |> Seq.iter (fun a ->
actorArray.[a] <- spawn system (string a) myActor
()
)
// First group
{0..100} |> Seq.iter(fun a ->
actorArray.[a] <! "first"
()
)
let rec loop() =
actor {
let! message = mailbox.Receive()
match message with
| _ ->
i <- (i - 1)
if (i = 0) then
// Second group
{101..199} |> Seq.iter(fun a ->
actorArray.[a] <! "second"
()
)
return! loop()
}
loop()
let mon = spawn system "myMon" myMonitor本质上,所发生的是一个外部参与者,myMonitor设置环境,并在的递归循环之外开始第一组任务。任务中的参与者现在在完成任务时发送"Done",这是在myMonitor递归循环中处理的。
一旦myMonitor接收到来自第一个块的所有消息,它就会启动第二个块。
https://stackoverflow.com/questions/36737786
复制相似问题