协程实现并发下载

    在单线程的程序中,采取的是顺序执行方式。对于下载程序来说,单线程的效率是极其低的,原因是它只能在下载完一个文件后才可以读取该文件。当接收一个远程文件时,程序将大部分时间花费在等待数据接收上。更明确地说,将时间用在了对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
<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值