"pony"라는 프로그래밍 언어가 오늘 발견되었습니다 ... 그걸 가지고 놀기 시작했습니다.데이터 경쟁? 아니면 뭔가 잘못 됐어?
내 코드는 간단한 제작자 소비자 일을하기로되어 있습니다. 언어 설명서에 따라이 언어는 데이터 경합이 없음을 보장합니다.
여기에서 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 bit, btw에서 실행 중. 내가 찾은 가장 최신의 최고의 zip 파일 설치
0.10.0-1c33065 [출시] 다음으로 컴파일됩니다. llvm 3.9.0 -?
나는이 언어에 대한 다양한 프레젠테이션에서 내가들은 것들 중 일부를 잘못 해석 한 것 같습니다. 인과 관계 메시지 순서화 : 소비자 관점에서 볼 때 인과 관계 메시지 처리 순서는 Tick (10 회), Query (한 번)입니다. 소비자 행위자는 메시지를 순서대로 처리해야합니다. 각 액터가 (무제한) 메시지 큐를 가지고 메시지를 가져온다는 주장을 감안할 때, 소비자 액터의 스케줄링은 그 순서대로 이루어져야합니다. 어쩌면 문서가 실제로 메시지를 처리하는 방법에 대한 자세한 설명이 있어야합니다. – BitTickler