在单线程的程序中,采取的是顺序执行方式。对于下载程序来说,单线程的效率是极其低的,原因是它只能在下载完一个文件后才可以读取该文件。当接收一个远程文件时,程序将大部分时间花费在等待数据接收上。更明确地说,将时间用在了对receive阻塞调用上。因此,如果一个程序可以同时下载所有文件的话,效率就会大大提升。当一个连接没有可用数据时,程序可用处理其它连接。
在Lua中,可用协同程序实现并发下载。可以为每个下载任务创建一个新的线程,只要一个线程无可用数据,它就可以将控制权切换到其他线程。
具体实现代码如下:
1、下载程序
require "socket"
function download(host, file)
local c = assert(socket.connect(host, 80))
local count = 0 -- 记录接收到的字节数
c:send("GET" .. file .. " HTTP/1.0\r\n\r\n")
while true do
local s, status, partial = receive(c)
count = count + #(s or partial)
if status == "closed" then break end
end
c:close()
print(file, count)
end
<