这个问题有几个部分,
首先,如何增加下面代码的可读性?
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)
}
}
runtime:sleep
,你也许可以利用未来。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
arr
如何在其他函数中使用、arr
和r
值如何构造等等?使用隔离可以确保所有这些都以可以保证并发安全的方式完成。例如,如果 add
被隔离,则 arr
也必须被隔离,因此,无论何时访问 arr
,编译器都将强制使用锁。另请参阅 https://ballerina.io/learn/distinctive-language-features/concurrency/#combine-isolated-function-with-lock。