큰 파일을 다운로드하고 동시에 다른 것을 처리하고 싶습니다.coroutine.yield()가없는 루아 라이브러리를 어떻게 다룰 수 있습니까?
그러나 luasocket.http
은 coroutine.yield()
으로 전화하지 않습니다. 파일을 다운로드하는 동안 다른 모든 것들이 멈 춥니 다. 당신이 볼 수 있듯이
1
Downloading large file
FINISHED download (200, 5242880bytes)
2
3
4
5
6
7
8
9
10
FINISHED printing numbers
Both done!
이 printRoutine
가 resume
: 그것은이 생산 실행
local http = require'socket.http'
local downloadRoutine = coroutine.create(function()
print 'Downloading large file'
-- Download an example file
local url = 'http://ipv4.download.thinkbroadband.com/5MB.zip'
local result, status = http.request(url)
print('FINISHED download ('..status..', '..#result..'bytes)')
end)
local printRoutine = coroutine.create(function()
-- Print some numbers
for i=1,10 do
print(i)
coroutine.yield()
end
print 'FINISHED printing numbers'
end)
repeat
local printActive = coroutine.resume(printRoutine)
local downloadActive = coroutine.resume(downloadRoutine)
until not downloadActive and not printActive
print 'Both done!'
:
여기에 예시는 내가 동시에 파일을 다운로드하고 몇 가지 숫자를 인쇄하려고이야 먼저. 숫자 1과 yield
을 인쇄합니다. downloadRoutine
은 resume
d이며을 생성하지 않고 전체 파일 을 다운로드합니다. 그래야 나머지 숫자가 인쇄됩니다.
나 자신의 소켓 라이브러리를 쓰고 싶지 않습니다! 내가 무엇을 할 수 있을지?
편집 (나중에 같은 날) : 일부 암소 사용자 have also noticed. 그들은 유용한 아이디어를 제공합니다.
코 루틴은 스레드가 아닙니다. 스레드처럼 취급해서는 안됩니다. 프로세스가 양보하기를 원하지 않는다면, 프로세스는 앞으로 나아 가지 않을 것이며, 프로세스가 양보 할 수도 없습니다. LuaSocket에는 비 차단 입출력을위한 몇 가지 기능이 있지만 LuaSocket에 익숙하지는 않으므로이를 조사해야합니다. –
LuaSocket은 비동기 (즉, 비 차단) 작업을 지원합니다. 라이브러리를 다시 작성하기 전에 RTFM. – Mud
진흙 : 그래, 원시'소켓'않습니다. 그러나'socket.http'는 그렇지 않습니다. (http://www.mail-archive.com/[email protected]/msg04969.html을보십시오.) – Anko