大きなファイルをダウンロードしながら、他のことも同時に処理したい。
ただし、をluasocket.http
呼び出さないでcoroutine.yield()
ください。ファイルのダウンロード中に他のすべてがフリーズします。
これは、ファイルのダウンロードといくつかの数字の印刷を同時に試みる実例です。
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
Downloading large file
FINISHED download (200, 5242880bytes)
2
3
4
5
6
7
8
9
10
FINISHED printing numbers
Both done!
ご覧のとおり、dprintRoutine
が最初です。resume
数字の1とyield
sを出力します。次にdownloadRoutine
、はresume
dであり、。を生成せずにファイル全体をダウンロードします。そうして初めて、残りの数字が印刷されます。
自分のソケットライブラリを書きたくない!私に何ができる?
編集(同じ日遅く):一部のMUSHユーザーも気づいています。彼らは役立つアイデアを提供します。