详解socket阻塞与非阻塞,同步与异步、I/O模型

一、socket阻塞与非阻塞

  1. 阻塞式socket

阻塞式socket在默认情况下处于阻塞状态,即程序会一直等待,直到数据准备好或者等待超时才返回结果。这种方式容易造成资源浪费,同时影响程序的性能。下面是一个阻塞式socket的示例:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.baidu.com", 80))
data = s.recv(1024)
print(data)
s.close()

上面代码会一直等待,直到服务器响应数据,并将响应的数据打印出来。

  1. 非阻塞式socket

非阻塞式socket在默认情况下处于非阻塞状态,即程序不会一直等待,而是立即返回结果。如果没有数据准备好,则会返回异常,需要通过轮询等方式来等待数据的准备。下面是一个非阻塞式socket的示例:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(False)
try:
    s.connect(("www.baidu.com", 80))
except Exception as e:
    print(e)

data = None
while not data:
    try:
        data = s.recv(1024)
    except Exception as e:
        pass

print(data)
s.close()

上面代码将socket设置为非阻塞模式,所以connect调用可能会引发异常。当数据准备好后,通过while循环一直尝试读取数据,直到成功读取,然后将读取到的数据打印出来。

二、同步与异步

  1. 同步方式

在同步方式中,程序会一直等待,直到操作完成。这时程序不能继续执行其他任务,即是阻塞的。同步方式适用于处理简单的任务,但对于复杂的任务或者数据量较大的任务,会造成程序的阻塞,影响程序的性能。下面是一个同步方式的示例:

import requests

response = requests.get("http://www.baidu.com")
print(response.text)

上面代码会一直等待服务器响应,响应完后将响应内容打印出来。

  1. 异步方式

在异步方式中,程序可以同时处理多个任务或者数据,不需要一直等待,处理完成后回调通知程序结果。异步方式适用于复杂的任务或处理大量数据时,可以提高程序的性能。下面是一个异步方式的示例:

import asyncio
import aiohttp

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get("http://www.baidu.com") as response:
            print(await response.text())

asyncio.run(main())

上面代码使用asyncio和aiohttp库实现异步方式的请求,可以同时处理多个请求,提高了程序的性能。

三、I/O模型

  1. 阻塞I/O模型

在阻塞I/O模型中,程序会一直等待,直到数据准备好或等待超时才继续执行。这种方式在处理数据时容易造成资源的浪费和程序性能的下降。下面是一个阻塞I/O模型的示例:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.baidu.com", 80))
s.send(b"GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n")
data = s.recv(1024)
print(data)
s.close()

上面代码会一直等待服务器响应数据,如果响应数据较慢或者网络出现问题,程序就会一直处于等待状态。

  1. 非阻塞I/O模型

在非阻塞I/O模型中,程序会立即返回,处理完本次任务后可以继续执行其他任务。如果数据没有准备好,则会返回一个异常,需要通过轮询等方式等待数据准备就绪。下面是一个非阻塞I/O模型的示例:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(False)
try:
    s.connect(("www.baidu.com", 80))
except Exception as e:
    print(e)

s.send(b"GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n")

data = None
while not data:
    try:
        data = s.recv(1024)
    except Exception as e:
        pass

print(data)
s.close()

上面代码将socket设置为非阻塞模式,并在数据发送后使用while循环轮询等待数据的准备。如果数据没有准备好,则会进行下一次轮询。

总的来说,socket阻塞与非阻塞、同步与异步、I/O模型是网络编程中比较重要的内容,掌握这些知识点对于编写高效的网络程序是十分有必要的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解socket阻塞与非阻塞,同步与异步、I/O模型 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs个人博客开发第六步 数据分页

    下面我会详细讲解“nodejs个人博客开发第六步 数据分页”的完整攻略。 步骤一:安装必要的依赖 在开始数据分页之前,我们需要安装一些必要的依赖,包括「mongoose-paginate」和「mongoose」。 npm install mongoose-paginate mongoose –save 步骤二:设置数据模型 在我们开始分页之前,我们需要先定…

    node js 2023年6月8日
    00
  • django将数组传递给前台模板的方法

    将数组传递给Django前端模板有两种方法: 方法一:使用context传递数组 在views.py文件中定义数组,然后在render函数中使用context将数组传递给前端模板。示例如下: from django.shortcuts import render def my_view(request): my_array = [1, 2, 3, 4, 5]…

    node js 2023年6月8日
    00
  • NodeJS学习笔记之网络编程

    NodeJS学习笔记之网络编程 学习NodeJS的网络编程,首先需要掌握以下几个核心概念:网络、协议、IP地址、端口、TCP协议和UDP协议。 网络概念 网络是指两台或多台计算机通过物理设备(例如交换机、路由器)或者空气波段(例如无线局域网)连接在一起,进行数据交换和资源共享的物理和逻辑集合体。 协议概念 网络中,协议是指计算机和计算机之间进行通讯时所采用的…

    node js 2023年6月7日
    00
  • 从Node.js 转到 Go平台

    从Node.js转到Go平台需要掌握以下技能点: 1.了解Go语言的基础语法和特性 2.掌握Go语言的标准库和常用的第三方工具库 3.学习如何使用Go语言的并发模型 4.理解如何优化Go语言应用程序的性能 下面是从Node.js转到Go平台的完整攻略: 1. 学习Go语言的基础语法和特性 了解Go语言的基础语法和特性是学习Go语言的第一步。你需要学习Go语言…

    node js 2023年6月8日
    00
  • JavaScript二叉树及各种遍历算法详情

    JavaScript二叉树及各种遍历算法详情 什么是二叉树 二叉树是一种树形数据结构,每个节点最多拥有两个子节点。根据节点的位置分为根节点、左子节点和右子节点。 二叉树的遍历方式 常用的二叉树遍历算法分为三种:前序遍历、中序遍历和后序遍历。 前序遍历 前序遍历是指先访问当前节点,然后按照左子树-右子树的顺序遍历所有子节点。 下面是一段前序遍历的示例代码: f…

    node js 2023年6月8日
    00
  • JS实现添加,替换,删除节点元素的方法

    要实现JS对节点元素的添加、替换、删除,可以使用DOM操作相关API。 添加节点元素 可以使用createElement()方法创建新的节点元素,并使用appendChild()方法将其添加到指定的父元素下。 // 创建新的节点元素 var newElement = document.createElement(‘p’); // 设置节点文本 newElem…

    node js 2023年6月8日
    00
  • Node.js和Express简单入门介绍

    下面是关于“Node.js和Express简单入门介绍”的完整攻略: Node.js和Express简单入门介绍 什么是Node.js? Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它可以使JavaScript代码运行在服务端,例如开发Web应用程序。Node.js使用的是事件驱动、非阻塞I/O模型,可以高效地处理大量并发请…

    node js 2023年6月8日
    00
  • NodeJS简单实现WebSocket功能示例

    接下来我详细讲解“NodeJS简单实现WebSocket功能示例”的完整攻略。 WebSocket简介 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 从开始握手时就与 HTTP 具有相似之处,因此能够通过现有的 HTTP 端口(80 和 443)进行通信,避免了被防火墙过滤的风险。WebSocket 网络通信协议可…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部