Python并发机制(三)——异步I/O(select & poll)

本文深入探讨Python的异步机制,主要介绍I/O多路复用中的select和poll方法。select系统调用用于监视多个文件描述符,当有文件描述符准备就绪时,内核会修改其标志位。尽管select具有良好跨平台性,但存在单进程监视fd数量限制的问题。poll则提供了一种类似的功能,通过eventmask进行操作,支持更多事件类型,如读取、写入等。
摘要由CSDN通过智能技术生成

python异步机制(三)——I/O多路复用

select

select通过一个select()系统调用来监视多个文件描述符组成的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,select本质上是通过设置或检查存放fd标志位的数据结构来进行下一步处理

优点:

  • 具有良好的跨平台性

缺点:

  • 单个进程可监视的fd数量被限制(在Linux上一般为1024)
  • 需要维护一个用来存放大量fd的数据结构(数组:线性表),使得用户空间和消耗大

服务器端:

#!/usr/bin/python
#coding=utf-8

import socket,sys,select,Queue

host = (sys.argv[1], int(sys.argv[2]))

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#阻塞与端口复用
sock.setblocking(False)
#SOL_SOCKET(套接字描述符),SO_REUSEADDR(端口复用,让端口释放后可以被立即使用)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(host)
sock.listen(5)

rlist = [sock]
wlist = []
msg_que = {}

timeout = 60

while True:
  rs, ws ,es = select.select(rlist, wlist, rlist, timeout)

  if not (rs or ws or es):
      print "timeout..."
      continue

  for r in rs:
      if r is
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值