再散分

ImN1 2013-04-14 02:26:43
首先膜拜一下那个非好汉不到的地方,忒厉害了

一个经验
写了个纯粹http get的socket(类似CLI下载器),单线程greenlet(3.3没有gevent,现在想动态添加任务还在找思路),换了5套方案,修改数十次,目前15秒内get了90个网页(仅线路较好的网站,约250kbytes/s),终于进入最后微调收尾
昨晚测试某个网站,还是出现阻塞CPU占用满顶,但没有出现超时错误……本以为non-blocking可以多循环几次就可重新获取数据,结果看来遇到10035无可避免还是要sleep 5毫秒,结果是整体速度都拖慢了

最后给从php转学或再学python的新手介绍个网站——
http://www.php2python.com
这网站上面是专门介绍php函数改写为python代码块的,熟悉php的初学者不妨去查询参考
...全文
278 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2013-04-19
  • 打赏
  • 举报
回复
引用 15 楼 qq120848369 的回复:
windows有IOCP作为proactor,配合多线程可以实现高并发I/O能力。 想做肯定都是有办法的。
确实,大不了多进程,不过这问题可以放一放,毕竟客户端程序速度说到底只是满足一下自己的优越感 现在比较关注是greenlet的机制,假如一次append几万条url,究竟并发是多少 目前几百条url,开currports查看并没有发现端口大量打开,应该说基本没怎么增加(这个还好),搞不清这是否win系统的限制,还是速度够快,让不少url快速完成关闭了端口(不像是这个原因),还是greenlet的功劳;不明则罔,担心程序移到其他机器就出问题了
qq120848369 2013-04-19
  • 打赏
  • 举报
回复
windows有IOCP作为proactor,配合多线程可以实现高并发I/O能力。 想做肯定都是有办法的。
ImN1 2013-04-19
  • 打赏
  • 举报
回复
现在留意到两点 1.只有国内的大站,刷刷的一下就完成了,加入两个线路一般的网站用时就一下子增加了3倍 2.测试的机器CPU不强,07年买的笔记本,打开/关闭浏览器运行程序差别很大,12x秒/7x秒的区别
疯狂-的-蜗牛 2013-04-19
  • 打赏
  • 举报
回复
接分的啊啊啊
  • 打赏
  • 举报
回复
主要就是访问不同ISP线路的网站,尤其是对于体积小的文件,节点连接延迟相对于整体传输时间的比例,相对于那些体积大的文件,明显要大得多。
  • 打赏
  • 举报
回复
网速有两个因素:一个是带宽,一个是节点连接反应速度。 前者还好说,可以用多线程、P2P等方式加快处理速度,但后者的话只有认命了。
mnxm 2013-04-16
  • 打赏
  • 举报
回复
感谢楼主分享
(☆随缘☆) 2013-04-15
  • 打赏
  • 举报
回复
感谢分享,
ImN1 2013-04-14
  • 打赏
  • 举报
回复
引用 7 楼 fibbery 的回复:
select/pool总可以吧?
win的select也只能用在socket,但我现在单一个socket并不慢(get网易首页三次只需0.4~0.6秒),慢的只是网速
fibbery 2013-04-14
  • 打赏
  • 举报
回复
select/pool总可以吧?
ImN1 2013-04-14
  • 打赏
  • 举报
回复
基于windows的3.3,所以epoll/libevent/gevent都用不上 另外下载的目标都不大,也就没考虑分拆文件 本想用asyncore,但研究了一些例子,似乎我的思路已经基本接近——现在的程序已经是返回状态给loop确定下一步骤,而asyncore模块处理错误似乎未能满足我的需求,再研究很花脑子,就算了 初步目测都是某几个连接较慢的host拖慢了,较快那些都是一闪而过(可能是greenlet的功劳) 现在有两个疑问: 1.greenlet究竟一次可以append多少个任务?看有文章分析greenlet运行机制,说机器能承受的话加上百万都没问题(有点难以置信,但目前是几百个url一批append确实没问题),因为后面确实有清单要下载几万个图片…… 2.如果上面1不成立,只能append一定数量,那么必然较慢host的任务是瓶颈,可能程序运行到一定时候只剩下少量任务,如何判断并动态添加新的任务进入greenlet?这个用gevent似乎很方便,有点无奈
qq120848369 2013-04-14
  • 打赏
  • 举报
回复
从脚本语言层面来看, 建议使用lua协程配合select/epoll进行实现, 这样可以借助协程维护堆栈的能力避免在C层面开发太多网络交互的代码, 直接可以使用非阻塞I/O接口配合yield/resume完成.
qq120848369 2013-04-14
  • 打赏
  • 举报
回复
实现细节上可以使用传统libevent+libcurl的multi接口实现异步http访问.
qq120848369 2013-04-14
  • 打赏
  • 举报
回复
1, 主线程独立epoll监控cli命令, 传递给嗅探线程. 2, 文件嗅探单线程, 独立epoll, 嗅探待下载文件的尺寸, 将该文件信息加入到任务列表排队(与整合线程共享), 并拆分成下载分片任务, 传递给下载线程池. 3, 下载线程池, 每个线程一个epoll, 完成文件分片下载, 分片下载完成传递给整合线程. 4, 单线程磁盘文件整合线程, 判定某任务分片完全后进行磁盘I/O整合为单一完整文件.
ImN1 2013-04-14
  • 打赏
  • 举报
回复
不到长城非好汉,偶算是个网络好汉了,哇咔咔卡……
bugs2k 2013-04-14
  • 打赏
  • 举报
回复
什么意思?

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧