Python处理多个客户端连接---多路复用选择服务器

多路复用

到目前为止,我们已经看到如何用分支进程和派生线程来同时处理多个客户端,以及一个封装了这两个方案的库类。在这两种方法下,所有的客户端处理程序似乎都是彼此并行运行(即在同一时间内)运行的,所以在接受新的请求或处理长期运行的客户端处理程序时,服务器未被阻塞。

不过从技术上讲,线程和进程并不是真正并行运行的,除非你足够幸运,机器有多个cpu。相反,你的操作系统可以执行一个变戏法的操作—它在所有活动任务之间分配计算机的处理能力。它先运行其中的某个任务的一部分,然后再运行另一个任务的一部分,就这样继续下去。所有任务看上去好像是并行运行的,但只是因为操作系统在任务切换的焦点如此之快,以至于你通常注意不到。这个由操作系统完成,在任务之间切换的进程有时也被称为时间片,在更多情况下,它被称为多路复用。

当我们派生线程和进程时,我们依靠操作系统来控制运行状态的任务,所以没有任务急需计算资源,尤其是主服务器调度循环。然而,没有理由可以任务python脚本不能这么做。例如一个脚本可能把任务分成多个步骤,先运行一个任务的某个步骤,然后再运行另一个任务的某个步骤,如此继续下去,直到所有的任务都完成。改脚本只需知道如何把注意力划分到多个活动任务中,以便在其自身采用多路复用。

select

服务器可以应用这种技术产生的另一种方式来一次处理多个客户端。改方式既不需要线程也不需要分支。通过多路复用客户端连接和拥有select系统调用的主调用程序,一个单一的事件循环就可以处理多个客户端,并可以并行接受新的客户端。这样的服务器有时也称为异步,在异步服务器上,一个单一的主循环在一个单独的进程和线程中运行,决定每次哪些客户端应该得到关注。如果已经准备好回话,那么客户端请求和主调用循环都会获得服务器小片的注意。

该服务器背后是操作系统select调用,在所有主要的平台上的python标准select模块中都可以获得。select让我们把注意力直接放到可以随时回话的套接字上,以避免阻塞对那些没有准备好的套接字的调用。也就是说,当select是套接字,我们可以确定套接字调用,如accept,recv和send通过select应用到返回对象时,不会阻塞服务器。正因为如此,使用select的单循环服务器不需要暂停与某个客户端的会话或等待新的客户端,而其他客户端则在焦急等待服务器的关注。

因为这种类型的服务器不需要启动线程或者进程,所以当与客户端的事务相对短暂时,这种类型的服务器可以发挥很大的作用。然而,它也要求这些事务是快速的;如果这些事务不够快,在等待某个特定时客户端会话结束时,它仍然有阻塞的风险,除非增加长时间运行会话的线程或者分支。

基于select的响应服务器

//服务器:使用select并行处理多个客户端。使用select模块手动在套接字之间多重通道传输:接收新的客户端连接的主套接字,并输入套接字到接收的客户端;select
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值