首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F# Akka -等待一组演员完成后再开始下一组

F# Akka -等待一组演员完成后再开始下一组
EN

Stack Overflow用户
提问于 2016-04-20 16:17:46
回答 1查看 438关注 0票数 1

因此,我在这里有一个玩具示例,其中我创建了200个角色,然后在发送最后100个角色之前发送一个"first"消息。

代码语言:javascript
复制
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模块了,但我不太确定如何实现它。

EN

回答 1

Stack Overflow用户

发布于 2016-04-21 05:07:44

所以我已经创建了一个解决方案,不确定它是否是最常用的,但它可以完成工作!

代码语言:javascript
复制
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接收到来自第一个块的所有消息,它就会启动第二个块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36737786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档