有什么方法可以简化/增加以下芭蕾舞演员代码的可读性吗?

问题描述 投票:0回答:1

这个问题有几个部分,

首先,如何增加下面代码的可读性?

string[] menu = ["pizza", "hot dog", "fries"];

public function main() {
  
    while true {
        if (//some breaking condition) {
            break;
        }
    if (// menu is empty) {
        // wait some time
        // continue;
    }
    string s = menu.remove(0);
    start modifyMenu(s);
        
    } 
}

function modifyMenu(string dish) {
    // BODY
    // we are appending some string to the menu
}

在上面的代码中,如果菜单为空,我们会等待一段时间然后继续。 while true ---> continue --> while true 步骤继续,直到菜单获得至少一个字符串。有更好的方法吗? (例如,如果菜单为空,则等待与空闲相同的步骤,直到菜单获取字符串或其他更好的方法)?

其次,我有以下隔离函数,它将记录值添加到数组中(定义为模块级变量并且也隔离)

isolated function add(Record r) {
    lock {
        arr.push(r)
    }
}

在这里我无法克隆“r”记录。这种行为的原因是什么?

第三,如果我从函数中删除隔离并删除模块级变量,同时仍然保持锁定,如下所示,它是并发安全的吗?

function add(Record r) {
    lock {
        arr.push(r)
    }
}
concurrency ballerina cloning
1个回答
0
投票
  1. 如果你想避免
    runtime:sleep
    ,你也许可以利用未来
  2. 您可能无法克隆,因为该类型不是
    value:Cloneable
    的子类型。您可以通过复制相关字段来显式创建新值 - 例如,
    {a: r.intV, b: r.arrV.clone(), c: isolatedObj}
    。请参阅 https://github.com/ballerina-platform/ballerina-spec/issues/856 (另请参阅此处传播的示例),https://github.com/ballerina-platform/ballerina-spec/问题/1244

如果它是可克隆值与不可克隆值的复杂结构,可以考虑的一种方法是查看是否可以相应地拆分记录以定义单独的结构。

请参阅以下链接了解有关可克隆的更多信息 -

https://lib.ballerina.io/ballerina/lang.value/latest

  1. 答案取决于它的调用方式、
    arr
    如何在其他函数中使用、
    arr
    r
    值如何构造等等?使用隔离可以确保所有这些都以可以保证并发安全的方式完成。例如,如果
    add
    被隔离,则
    arr
    也必须被隔离,因此,无论何时访问
    arr
    ,编译器都将强制使用锁。另请参阅 https://ballerina.io/learn/distinctive-language-features/concurrency/#combine-isolated-function-with-lock
© www.soinside.com 2019 - 2024. All rights reserved.