我想下载一个大文件并同时处理其他事情。
但是,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!
如您所见,printRoutine
是resume
d 首先。它打印数字 1 和yield
s。然后downloadRoutine
是resume
d,它下载整个文件,而不产生. 只有这样才能打印其余的数字。
我不想编写自己的套接字库!我能做些什么?
编辑(同一天晚些时候):一些 MUSH 用户也注意到了。他们提供有用的想法。