就在今天发现了编程语言“小马”......并开始玩它。数据竞赛?还是别的什么问题?
我的代码应该做一些简单的生产者消费者的事情。如语言文档所声明的,该语言确保没有数据竞赛。
这里,main向生产者发送10条消息,生产者又向消费者发送10条消息。消费者递增计数器状态变量。然后,main向消费者发送消息,然后消费者向main发送消息以显示当前值。如果所有消息都按顺序排列,则预期值将是9(或10)。结果打印,虽然是0.
因为这是我在玩这个语言的第一小时,当然我可能会搞砸了其他的东西。
谁能解释我的错误?
use "collections"
actor Consumer
var _received : I32
new create() =>
_received = 0
be tick() =>
_received = _received + 1
be query(main : Main) =>
main.status(_received)
actor Producer
var _consumer : Consumer
new create(consumer' : Consumer) =>
_consumer = consumer'
be produceOne() =>
_consumer.tick()
actor Main
var _env : Env
new create(env: Env) =>
_env = env
let c : Consumer = Consumer.create()
let p = Producer.create(c)
for i in Range[I32](0,10) do
p.produceOne()
end
c.query(this)
be status(count : I32) =>
// let fortyTwo : I32 = 42
// _env.out.print("fortytwo? " + (fortyTwo.string()))
_env.out.print("produced: " + (count.string()))
运行在Windows 10,64位,顺便说一句。与我发现的最新和最大的zip文件安装。
0.10.0-1c33065 [release] 编译时使用:llvm 3.9.0 - ?
似乎我误解了我在各种演示中听到的有关此语言的一些内容。因果消息排序我采用这种方式:从消费者的角度来看,因果消息处理顺序为:勾选(10次),然后查询(一次)。消费者演员应按照该顺序处理消息。如果声称每个参与者都有一个(无界)消息队列,它会从消息队列中提取消息,消费者演员的调度将不得不按照该顺序进行。也许文档应该更清楚地说明演员如何处理消息。 – BitTickler