下载8个1m大小文件,测试五次分别耗时12.038s,10.316s,8.955s,11.275s,9.499s(lua代码实现如下)

require "socket"

--host = "www.w3.org"
--file = "/TR/REC-html32.html" function lua_string_split(str, split_char) --字符串拆分 local sub_str_tab = {};
while (true and str ~= nil) do
local pos = string.find(str, split_char);
if (not pos) then
sub_str_tab[#sub_str_tab + ] = str;
break;
end
local sub_str = string.sub(str, , pos - );
sub_str_tab[#sub_str_tab + ] = sub_str;
str = string.sub(str, pos + , #str);
end return sub_str_tab;
end function download(url)
local infolist = lua_string_split(url,"/")
local cache_file = infolist[#infolist] local host = infolist[]
local pos = string.find(url, host)
local file = nil
if pos then
file = string.sub(url, pos + #host)
end
pos = nil local out = io.open(cache_file,"wb")
local c = assert(socket.connect(host, ))
local count =
local pos = nil 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)
local data = s or partial if data then
if pos == nil then --去除响应头
pos = string.find(data, "\r\n\r\n")
if pos then
out:write(string.sub(data, pos + #"\r\n\r\n"))
end
else
out:write(data)
end
end
if status == "closed" then break end
end
c:close()
-- print(file, count)
out:close()
-- os.execute("del " .. cache_file)
end function receive(connection)
connection:settimeout()
local s, status, partial = connection:receive(^*)
if status == 'timeout' then
coroutine.yield(connection)
end
return s or partial, status
end threads = {} function get(url)
local co = coroutine.create(function ()
download(url)
end)
table.insert(threads, co)
end function dispatch()
local i =
local connections = {}
while true do
if threads[i] == nil then
if threads[] == nil then break end
i =
connections = {}
end
local status, res = coroutine.resume(threads[i])
if not res then
table.remove(threads, i)
else
i = i +
connections[#connections + ] = res
if #connections == #threads then
local a, b, err = socket.select(connections)
for k, v in pairs(a) do
--print(k, 'a=a', v)
end
for k, v in pairs(b) do
--print(k, 'b=b', v)
end
end
end
end
end --get("http://www.w3.org/TR/REC-html32.html")
--get("http:///1/将夜") --下载中文会出错 local files = {'a','b','c','d','e','f','g','h'}
for i=,#files do
get("http://127.0.0.1/" .. files[i] .. ".file")
end dispatch() print(os.clock())

下载8个1m大小文件,测试五次分别耗时12.324s,14.407s,13.883s,15.188s,8.887s(python代码实现如下)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import os
import time
import urllib
import urllib2
import multiprocessing
from time import clock def worker(pline): rinfo = pline.split("/")
filename, url = rinfo[len(rinfo)-1], pline filename = urllib2.unquote(filename)
try:
f = urllib2.urlopen(url,timeout=10800)
with open(filename, "wb") as code:
code.write(f.read())
except:
print sys.exc_info()
return 0 return 1
#
# main
# if __name__ == "__main__": start = clock()
pool_size = multiprocessing.cpu_count() * 2
pool = multiprocessing.Pool(processes=pool_size) for i in ["a","b","c","d","e","f","g","h"]:
url = "http://127.0.0.1/"+i+".file"
pool.apply_async(worker, (url,)) pool.close()
pool.join()
end = clock()
print (end-start)

就算把python的进程池设置为1个,利用单cpu跑,耗时结果测试也是一样的。看不出来lua的协程对性能有多大的提升,感觉用多进程能实现的,就还是不要去折腾协程吧,毕竟协程不能利用多核的优势,编程也麻烦很多。

附:lua使用luasocket库发起http请求很方便

local http = require("socket.http")

local chunkbody = {}
res, code, headers = http.request {
method = "GET",
url = "http://127.0.0.1/get.php",
sink = ltn12.sink.table(chunkbody)
} if res ~= nil then
print(code)
for k,v in pairs(headers) do
print(k .. ":" .. v)
end
print(table.concat(chunkbody))
else
io.write(code .. "\n")
end --res, code, headers = http.request("http://127.0.0.1/post","name=admin&passwd=adminpwd")
local postdata = "name=admin&passwd=adminpwd"
chunkbody = {}
res, code, headers = http.request {
method = "POST",
url = "http://127.0.0.1/post",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
["Content-Length"] = string.len(postdata)
},
source = ltn12.source.string(postdata),
sink = ltn12.sink.table(chunkbody)
}
if res ~= nil then
print(code)
for k,v in pairs(headers) do
print(k .. ":" .. v)
end
print(table.concat(chunkbody))
else
io.write(code .. "\n")
end --[[
200
connection:close
content-type:text/html
date:Sun, 16 Nov 2014 16:02:16 GMT
transfer-encoding:chunked
x-powered-by:PHP/5.3.3
server:openresty/1.7.2.1
a and b
201
connection:close
content-type:application/octet-stream
date:Sun, 16 Nov 2014 16:02:16 GMT
transfer-encoding:chunked
server:openresty/1.7.2.1
pass
--]]

lua协程并发下载简单测试的更多相关文章

  1. python 协程并发下载图片

    1 import aiohttp 2 import asyncio 3 import time 4 5 async def dl_coroutine(session,url): 6 print('开始 ...

  2. Lua协程-测试3

    print("Lua 协程测试3") -- 实现消费者-生产者关系(生产一个就消费一个) count = -- 生产总数 -- 生产者 local newProductorCo = ...

  3. Lua协程-测试2

    print("Lua 协程测试2") function testFun(n) print("into foo,n = "..n) * n) -- 挂起co协程 ...

  4. 大富翁开发日记:一、使用巨型lua协程

    一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程. lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计.但这次我 ...

  5. Openresty Lua协程调度机制

    写在前面 OpenResty(后面简称:OR)是一个基于Nginx和Lua的高性能Web平台,它内部集成大量的Lua API以及第三方模块,可以利用它快速搭建支持高并发.极具动态性和扩展性的Web应用 ...

  6. Lua 协程coroutine

    协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...

  7. [转]-Lua协程的实现

    协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另 外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使 ...

  8. lua协程实现

    协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使用 ...

  9. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

随机推荐

  1. (iOS)Storyboard/xib小技巧

    1.选择被view覆盖住的view 当你想直接在view中选择自己想要的元素时,但是又碍于一个view上叠加的元素太多很难直接选中,那么在这时,你同时按住键盘上的shift和 control键,然后在 ...

  2. python进阶4--pywin32

    python 在windows下系统编程 1.环境配置:Python是没有自带访问windows系统API的库的,需要下载.库的名称叫pywin32,可以从网上直接下载. 以下链接地址可以下载: ht ...

  3. css3_note

    css3基础 css3选择器 属性选择器 属性选择器基本上IE7+都支持,可以放心的使用,参见caniuse [attr] [attr=val] [attr*=val] [attr^=val] [at ...

  4. linux下解压iso文件

    .iso文件的格式是iso9660,iso9660是cd上的一种文件系统, 也就是说是 是数据在cd上的组织形式: 它的一些限制是: 1.最多8级子目录(可以用RockRidge Extension增 ...

  5. 用extundelete恢复rm -rf删的文件

    “慎用rm -rf命令,除非你知道此命令带来的后果.”这是一条Linux用户守则,虽然大多数用户都明白这条语句的含义,但是我觉得还需要完善一下,为这条语句加 上一个使用前提:在你确认自己拥有清醒头脑, ...

  6. 《windows程序设计》学习_3.4:实现雷区翻转

    #include<windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPAR ...

  7. Michael Kors成了时尚行业的公敌-股票频道-和讯网

    Michael Kors成了时尚行业的公敌-股票频道-和讯网 Michael Kors成了时尚行业的公敌 字号   评论 邮件 纠错 2014年03月03日17:32 来源:财经天下    全球消费不 ...

  8. java类的结构(属性、方法、构造函数)

    一.类的定义形式类定义的一般形式如下 [类定义修饰符] class  <类名> {   //类体 [成员变量声明] [构造函数] [成员方法] } 前面说过,在描述java语法时,方括号中 ...

  9. 吝啬的国度(dfs+vector)

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...

  10. [置顶] fmt日期格式化

    jstl中的日期格式化 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> & ...