非阻塞套接字

开始之前,需要先了解一下什么会引起进程阻塞和唤醒的事件

(1)向系统请求共享资源失败。  进程在向系统请求共享资源时,由于系统已无足够的资源分配给它,此时进程因不能继续运行而转变为阻塞状态。

(2)等待某种操作的完成。

  当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则先将该进程阻塞起来以等待操作完成。

(3)新数据尚未达到。

  对于相互合作的进程,如果一个进程需要先获得另一个进程提供的数据后才能对该数据进行处理,只要其所需数据尚未到达,进程便只有阻塞。

(4)等待新任务的到达。

  在某些操作系统中,特别是在网络环境下的OS,往往设置一些特定的系统进程,每当这种进程完成任务后便把自己阻塞起来,等待新任务的到来。


 

socket 

 

在建立连接和数据传输的时候,都会存在等待,就是一种阻塞,一次只能服务一个客户端,排队机制,会存在资源的浪费,cpu的浪费,是不可取的

 

非阻塞套接字

就是将连接和接收的阻塞位置变成错误,再通过try进行捕获错误BlockingIOError,pass掉

try:
    conn,addr = server.accept()
    conn.setblocking(False)
except BlockingIOError:
    pass

 

建立费阻塞套接字的方法是:

套接字.setblocking(False)

 

用非阻塞创建一个服务端:可同时处理多个客户请求

复制代码
import socket
server = socket.socket()
server.setblocking(False)   # 设置为非阻塞套接字
server.bind(('', 7790))
server.listen(5)
all_conn = []
while True:
    try:
        conn, addr = server.accept()
        conn.setblocking(False)  # 新的非阻塞套接字,没有连接会报错
        all_conn.append(conn)    # 保存记录连接的客户端
    except BlockingIOError:     # 捕获错误pass掉
        pass
    for conn in all_conn:
        try:
            recv_data = conn.recv(1024)
            if recv_data:
                print(str(addr) + '>>>' + recv_data.decode())
                conn.send(recv_data)
            else:
                conn.close()
                all_conn.remove(conn)
        except BlockingIOError:    
            pass
复制代码

 

posted @   pywjh  阅读(280)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
回到顶部
点击右上角即可分享
微信分享提示