요약 : busywaiting하지 않고도 스크립트에 시간이 흐를 수 있습니까? os.execute('sleep 1')
을 사용하면 절단되지 않고 시간이 낭비됩니다.루아에서 os.clock() 증가시키기
세부
나는 특정 간격 후 작업을 수행 a library 있습니다. 나는 현재 테이블을 시간순으로 정렬 된 목록에 삽입하여이 작업을 예약합니다. 대략 :
local delayedWork = {}
function handleLater(data, delaySeconds)
local delayedItem = { data=data, execTime=os.clock() + delaySeconds }
local i=1
for _,existing in ipairs(delayedWork) do
if existing.execTime > delayedItem.execTime then break else i=i+1 end
end
table.insert(delayedWork,i,delayedItem)
end
나중에 정기적으로 작업을 확인합니다. 대략 :
는function processDelayedWork()
local i,last = 1,#delayedWork
while i<=last do
local delayedItem = delayedWork[i]
if delayedItem.execTime <= os.clock() then
table.remove(delayedWork,i)
-- use delayedItem.data
last = last-1
else
i=i+1
end
end
end
(이 벽 시간 대신 CPU 시간을 사용한다는 사실이 다른 문제에 대한 문제이다 I 반복 압축 패스 처리를 대신 한 동안 어레이를 이동한다는 사실은 최적화 관계 없다. 여기를 클릭하십시오.)
시스템의 단위 테스트를 실행할 때 시간이 지체 될 필요가 있습니다. 그러나 os.execute('sleep 1')
을 호출하면 초당 벽시계가 소비되지만 os.clock()
은 증가하지 않습니다. 통과
$ lua -e "require 'os' print(os.time()) os.execute('sleep 0.4') print(os.time())"
1397704209
1397704209
내가 시간을 강제 할 수이는 정수 초 (그리고 숫자 float
대신 double
를 사용하여 컴파일 된 시스템보다 작은) 때문에 나는 os.time()
을 사용할 수 없습니다
$ lua -e "require 'os' print(os.clock()) os.execute('sleep 1') print(os.clock())"
0.002493
0.002799
그냥 바쁜 기다림없이 내 대본에?
단위 테스트를 좀 더 쉽게하기 위해 런타임을 수정하는 데 이상한 것 같습니다. 더 좋은 해결책이 없다는 것이 너무 나쁘다.하지만이 좋은 아이디어를 받아 들인다. – Phrogz