当前位置: 首页 > news >正文

外网设计网站大型电商网站开发方案

外网设计网站,大型电商网站开发方案,24小时通过网站备案,镇江网站优化推广来源#xff1a;http://www.cnblogs.com/maociping/p/5132583.html 1、内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念#xff0c;一个流可以是文件#xff0c;socket#xff0c;pipe等可以进行…来源http://www.cnblogs.com/maociping/p/5132583.html 1、内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理     首先我们来定义流的概念一个流可以是文件socketpipe等可以进行I/O操作的内核对象。不管是文件还是套接字(socket)还是管道(pipe)我们都可以把他们看作流。     之后我们来讨论I/O操作通过read我们可以从流中读入数据通过write我们可以往流中写入数据。现在假定1种情形我们需要从流中读数据但是流中还没有数据典型的例子为客户端要从socket读数据但是服务器端还没有把数据传回来这时候该怎么办     阻塞阻塞是个什么概念呢比如某个时候你在等快递但是你还不知道快递什么时候过来而且你也没有别的事可以干或者说接下来的事要等快递来了才能做那么你可以去睡觉了因为你知道快递把货送来时一定会给你打电话假定一定能叫醒你。     非阻塞忙轮询接着上面等快递的例子如果用忙轮询的方法那么你需要知道快递员的手机号然后每分钟给他打个电话“你到了没”     很明显一般人不会用第二种做法不仅显得无脑浪费话费不说还占用了快递员大量的时间。     大部分程序也不会用第二种做法因为第一种方法经济而简单经济是指消耗很少的CPU时间如果线程睡眠了就掉出了系统的调度队列暂时不会去瓜分CPU宝贵的时间片。     为了了解阻塞是如何进行的我们来讨论缓冲区以及内核缓冲区最终把I/O事件解释清楚。缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用你知道它很慢的当你操作一个流时更多的是以缓冲区为单位进行操作这是相对于用户空间而言。对于内核来说也需要缓冲区。     假设有一个管道进程A为管道的写入方B为管道的读出方。假设一开始内核缓冲区是空的B作为读出方被阻塞着。然后首先A往管道写入这时候内核缓冲区由空的状态变到非空状态内核就会产生一个事件告诉B该醒来了这个事件姑且称之为“缓冲区非空”。但是“缓冲区非空”事件通知B后B却还没有读出数据且内核许诺了不能把写入管道中的数据丢掉这个时候写入的数据会滞留在内核缓冲区中如果内核也缓冲区满了B仍未开始读数据最终内核缓冲区会被填满这个时候会产生一个I/O事件告诉进程A你该等等阻塞了我们把这个事件定义为“缓冲区满”。假设后来终于开始读数据了于是内核的缓冲区空了出来这时候内核会告诉A内核缓冲区有空位了你可以从长眠中醒来了继续写数据了我们把这个事件叫做“缓冲区非满”。也许事件Y1已经通知了A但是A也没有数据写入了而继续读出数据知道内核缓冲区空了。这个时候内核就告诉B你需要阻塞了我们把这个时间定为“缓冲区空”。     这四种情形涵盖了四个I/O事件内核缓冲区满内核缓冲区空内核缓冲区非空内核缓冲区非满。这四个I/O事件是进行阻塞同步的根本。如果不能理解“同步”是什么概念请学习操作系统的锁信号量条件变量等任务同步方面的相关知识。     然后我们来说说阻塞I/O的缺点。但是阻塞I/O模式下一个线程只能处理一个流的I/O事件。如果想要同时处理多个流要么多进程(fork)要么多线程(pthread_create)很不幸这两种方法效率都不高。于是再来考虑非阻塞忙轮询的I/O方式我们发现可以同时处理多个流把一个流从阻塞模式切换到非阻塞模式再此不予讨论 1 while true { 2 for i in stream[]; { 3 if i has data 4 read until unavailable 5 } 6 }     我们只要不停的把所有流从头到尾问一遍又从头开始。这样就可以处理多个流了但这样的做法显然不好因为如果所有的流都没有数据那么只会白白浪费CPU。这里要补充一点阻塞模式下内核对于I/O事件的处理是阻塞或者唤醒而非阻塞模式下则把I/O事件交给其他对象后文介绍的select以及epoll处理甚至直接忽略。     为了避免CPU空转可以引进一个代理一开始有一位叫做select的代理后来又有一位叫做poll的代理不过两者的本质是一样的。这个代理比较厉害可以同时观察许多流的I/O事件在空闲的时候会把当前线程阻塞掉当有一个或多个流有I/O事件时就从阻塞态中醒来于是我们的程序就会轮询一遍所有的流于是我们可以把“忙”字去掉了。代码长这样: 1 while true { 2 select(streams[]) 3 for i in streams[] { 4 if i has data 5 read until unavailable 6 } 7 }     于是如果没有I/O事件产生我们的程序就会阻塞在select处。但是依然有个问题我们从select那里仅仅知道了有I/O事件发生了但却并不知道是那几个流可能有一个多个甚至全部我们只能无差别轮询所有流找出能读出数据或者写入数据的流对他们进行操作。     但是使用select我们有O(n)的无差别轮询复杂度同时处理的流越多每一次无差别轮询时间就越长。再次说了这么多终于能好好解释epoll了。     epoll可以理解为event poll不同于忙轮询和无差别轮询epoll只会把哪个流发生了怎样的I/O事件通知我们。此时我们对这些流的操作都是有意义的复杂度降低到了O(1)。     在讨论epoll的实现细节之前先把epoll的相关操作列出 1 epoll_create创建一个epoll对象一般epollfd epoll_create() 2 epoll_ctl epoll_add/epoll_del的合体往epoll对象中增加/删除某一个流的某一个事件 3 比如 4 epoll_ctl(epollfd, EPOLL_CTL_ADD, socket, EPOLLIN);//注册缓冲区非空事件即有数据流入 5 epoll_ctl(epollfd, EPOLL_CTL_DEL, socket, EPOLLOUT);//注册缓冲区非满事件即流可以被写入 6 epoll_wait(epollfd,...)等待直到注册的事件发生 7 注当对一个非阻塞流的读写发生缓冲区满或缓冲区空write/read会返回-1并设置errnoEAGAIN。而epoll只关心缓冲区非满和缓冲区非空事件。  一个epoll模式的代码大概的样子是 while true {      active_stream[]  epoll_wait(epollfd)      for i in active_stream[] {          read or write till      }   }  2 python中的epoll    从以上可知epoll是对select、poll模型的改进提高了网络编程的性能广泛应用于大规模并发请求的C/S架构中。   1、触发方式      边缘触发/水平触发只适用于Unix/Linux操作系统    2、原理图   3、一般步骤 Create an epoll object——创建1个epoll对象Tell the epoll object to monitor specific events on specific sockets——告诉epoll对象在指定的socket上监听指定的事件Ask the epoll object which sockets may have had the specified event since the last query——询问epoll对象从上次查询以来哪些socket发生了哪些指定的事件Perform some action on those sockets——在这些socket上执行一些操作Tell the epoll object to modify the list of sockets and/or events to monitor——告诉epoll对象修改socket列表和或事件并监控Repeat steps 3 through 5 until finished——重复步骤3-5直到完成Destroy the epoll object——销毁epoll对象   4、相关用法 import select 导入select模块 epoll select.epoll()创建一个epoll对象 epoll.register(文件句柄,事件类型)注册要监控的文件句柄和事件 事件类型:   select.EPOLLIN    可读事件   select.EPOLLOUT   可写事件   select.EPOLLERR   错误事件   select.EPOLLHUP   客户端断开事件 epoll.unregister(文件句柄)  销毁文件句柄 epoll.poll(timeout) 当文件句柄发生变化则会以列表的形式主动报告给用户进程,timeout                      为超时时间默认为-1即一直等待直到文件句柄发生变化如果指定为1                      那么epoll每1秒汇报一次当前文件句柄的变化情况如果无变化则返回空 epoll.fileno() 返回epoll的控制文件描述符(Return the epoll control file descriptor) epoll.modfiy(fineno,event)fineno为文件描述符 event为事件类型  作用是修改文件描述符所对应的事件 epoll.fromfd(fileno)从1个指定的文件描述符创建1个epoll对象 epoll.close()   关闭epoll对象的控制文件描述符    5 实例客户端发送数据 服务端将接收的数据返回给客户端 1 #!/usr/bin/env python2 #-*- coding:utf-8 -*-3 4 import socket5 import select6 import Queue7 8 #创建socket对象9 serversocket socket.socket(socket.AF_INET, socket.SOCK_STREAM) 10 #设置IP地址复用 11 serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 12 #ip地址和端口号 13 server_address (127.0.0.1, 8888) 14 #绑定IP地址 15 serversocket.bind(server_address) 16 #监听并设置最大连接数 17 serversocket.listen(10) 18 print 服务器启动成功监听IP , server_address 19 #服务端设置非阻塞 20 serversocket.setblocking(False) 21 #超时时间 22 timeout 10 23 #创建epoll事件对象后续要监控的事件添加到其中 24 epoll select.epoll() 25 #注册服务器监听fd到等待读事件集合 26 epoll.register(serversocket.fileno(), select.EPOLLIN) 27 #保存连接客户端消息的字典格式为{} 28 message_queues {} 29 #文件句柄到所对应对象的字典格式为{句柄对象} 30 fd_to_socket {serversocket.fileno():serversocket,} 31 32 while True: 33 print 等待活动连接...... 34 #轮询注册的事件集合返回值为[(文件句柄对应的事件)(...),....] 35 events epoll.poll(timeout) 36 if not events: 37 print epoll超时无活动连接重新轮询...... 38 continue 39 print 有 , len(events), 个新事件开始处理...... 40 41 for fd, event in events: 42 socket fd_to_socket[fd] 43 #如果活动socket为当前服务器socket表示有新连接 44 if socket serversocket: 45 connection, address serversocket.accept() 46 print 新连接 , address 47 #新连接socket设置为非阻塞 48 connection.setblocking(False) 49 #注册新连接fd到待读事件集合 50 epoll.register(connection.fileno(), select.EPOLLIN) 51 #把新连接的文件句柄以及对象保存到字典 52 fd_to_socket[connection.fileno()] connection 53 #以新连接的对象为键值值存储在队列中保存每个连接的信息 54 message_queues[connection] Queue.Queue() 55 #关闭事件 56 elif event select.EPOLLHUP: 57 print client close 58 #在epoll中注销客户端的文件句柄 59 epoll.unregister(fd) 60 #关闭客户端的文件句柄 61 fd_to_socket[fd].close() 62 #在字典中删除与已关闭客户端相关的信息 63 del fd_to_socket[fd] 64 #可读事件 65 elif event select.EPOLLIN: 66 #接收数据 67 data socket.recv(1024) 68 if data: 69 print 收到数据 , data , 客户端 , socket.getpeername() 70 #将数据放入对应客户端的字典 71 message_queues[socket].put(data) 72 #修改读取到消息的连接到等待写事件集合(即对应客户端收到消息后再将其fd修改并加入写事件集合) 73 epoll.modify(fd, select.EPOLLOUT) 74 #可写事件 75 elif event select.EPOLLOUT: 76 try: 77 #从字典中获取对应客户端的信息 78 msg message_queues[socket].get_nowait() 79 except Queue.Empty: 80 print socket.getpeername() , queue empty 81 #修改文件句柄为读事件 82 epoll.modify(fd, select.EPOLLIN) 83 else : 84 print 发送数据 , data , 客户端 , socket.getpeername() 85 #发送数据 86 socket.send(msg) 87 88 #在epoll中注销服务端文件句柄 89 epoll.unregister(serversocket.fileno()) 90 #关闭epoll 91 epoll.close() 92 #关闭服务器socket 93 serversocket.close() 1 #!/usr/bin/env python2 #-*- coding:utf-8 -*-3 4 import socket5 6 #创建客户端socket对象7 clientsocket socket.socket(socket.AF_INET,socket.SOCK_STREAM)8 #服务端IP地址和端口号元组9 server_address (127.0.0.1,8888) 10 #客户端连接指定的IP地址和端口号 11 clientsocket.connect(server_address) 12 13 while True: 14 #输入数据 15 data raw_input(please input:) 16 #客户端发送数据 17 clientsocket.sendall(data) 18 #客户端接收数据 19 server_data clientsocket.recv(1024) 20 print 客户端收到的数据server_data 21 #关闭客户端socket 22 clientsocket.close()   参考资料       http://blog.csdn.net/mango_song/article/details/42643971       http://www.cnblogs.com/Alanpy/articles/5125986.html       http://scotdoyle.com/python-epoll-howto.html       http://www.haiyun.me/archives/1056.html
http://wiki.neutronadmin.com/news/324330/

相关文章:

  • 网站建设和推广评价指标深圳市建设中心官网网址
  • wap网站案例如何用手机做网站吗
  • 易思企业网站杭州网站搭建
  • 自己建立公司网站 怎样做织梦cms模板
  • 上海网站建设的网站徐城乡建设局网站
  • 国外社交网站做的比较好的是制作网站案例网址
  • 黄石网站设计制作开源商城
  • 海南网站建设fwlitwordpress写网站教程
  • 专业自助建站如何做国外假发网站
  • 包装设计网站免费招投标网站建设
  • 感觉做的比较好的健身网站百度精准营销获客平台
  • 苏州网站建设用哪种好如何提高网站打开速度
  • 网站做seo屏蔽搜索番禺区移动端网站制作
  • 秦皇岛建设信息网站某个产品营销推广方案
  • 帝国cms网站网站大全
  • 阿里云里做网站能上百度首页么免费域名网站哪个最好
  • 中山手机网站建设费用上海网站推广策划
  • 温州网站建设外包国际新闻用什么软件看看
  • 网站开发的形式有( )学网站开发有什么好处
  • 互联网网站建设月总结爱丫爱丫在线观看视频
  • 网站的速度前段 网站建设实例
  • tp网站开发wordpress淘宝优惠券
  • 东莞市建设工程网站制作百度移动网站
  • 自学网站建设wordpress文章管理模板下载
  • 深圳网站制作济南安康微平台
  • 织梦网站怎样做子域名数商云招聘
  • 如何利用网站模板做网站广州网页设计html
  • 网站关键字怎么修改校园网站建设方案模板下载
  • 湖南网站建设 尖端磐石网络wordpress编辑页面上方有白条
  • 自己做发小说网站网站开发 网页设计北京师范大学出版社