首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux网络编程系列(七)--如何将socket设置成非阻塞,非阻塞socket与阻塞socket收发数据区别

阻塞阻塞在收发数据时有什么区别 3.1 发送时区别 3.1.1 TCP发送(即send函数) send函数阻塞模式下,会等待所有数据都被拷贝到发送缓冲区才会返回,也就是说,阻塞模式下,send函数返回值必定是参数中发送长度大小...UDP发送(即sendto函数) 即使阻塞模式下,sendto也不会阻塞,因为UDP并没有真正发送缓冲区,它所做只是将应用缓冲区数据拷贝给下层协议栈,加上UDP头、IP头等,实际是不存在阻塞,...3.2 接收时区别 3.2.1 TCP接收(即recv函数) 阻塞模式下, recv将会阻塞,直到缓冲区里有至少一个字节才返回,当没有数据到来时,recv会一直阻塞或者直到超时,不会返回; 阻塞模式下..., recv不会阻塞,如果缓冲区里有任何一个字节,都会立即返回, 而如果没有数据,则返回错误WSAEWOULDBLOCK; 3.2.2 UDP接收(即recvfrom函数) 阻塞模式下,recvfrom...将会阻塞,直到缓冲区里有一个完整UDP数据包才会返回; 阻塞模式下,recvfrom函数会立即返回, 如果缓冲区有一个完整数据包,就会返回数据报大小,如果没有数据,也是返回错误WSAEWOULDBLOCK

3K30
您找到你想要的搜索结果了吗?
是的
没有找到

Python中多路复用 (select、poll 和 epoll)

而在非阻塞式IO中,没有等待立即返回(当然阻塞是不会消耗CPU),但是这里面存在一个问题就是无法知晓是否已完成,需要二次判断(需要花费大量时间用于状态判断)。...如果后续操作是建立在前面完成基础,那这个非阻塞式IO效果并没有那么好,甚至会比阻塞式IO还差;如果后续操作不依赖于前述操作,而效果非常明显。...因此无法准确说明是非阻塞式IO强于阻塞式IO,还是阻塞式IO强于非阻塞式IO,没有一个结论,需要结合具体应用场景。...而在IO复用中,select方法其实也是阻塞,如果操作系统中没有一个socket或者没有一个文件句柄准备好了,这个情况下它会一直阻塞下去,有的话就会立即返回,实际它节省了等待数据过程,但是将数据从内核拷贝到用户空间这一过程还是无能为力...无法立即完成一个非阻止性套接字操作。

4K30

IO多路复用丶基于IO多路复用+sock

,在哪儿等待百度给它回消息.我们可以把阻塞地方变成非阻塞,这样可以一直给百度发送请求了,不要在哪儿傻傻等待百度给回复了....,但是会报BlockingIOError错误,只要捕获即可     异步,通知,执行完成之后自动执行回调函数或自动执行某些操作(通知).       ...IO,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(非IO操作切换与效率无关)   对比操作系统控制线程切换,用户单线程内控制协程切换   优点如下:     1.协程切换开销更小...,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级     2.单线程内就可以实现并发效果,最大限度地利用CPU   缺点如下:     1.协程本质是单线程下,无法利用多核,可以使一个程序开启多个进程...,每个进程内开启多个线程,每个线程内开启协程     2.协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程   总结:     1.必须在只有一个单线程里实现并发(协程本身无法实现并发)

70820

解决No module named fcntl

某些操作系统,如Windows系统,是不支持fcntl模块,因此会导致该错误出现。解决办法如果你Windows系统遇到了这个错误,你可以尝试使用其他替代模块来替代fcntl模块功能。...由于文件处于非阻塞模式,如果没有数据可读取,read操作会立即返回并抛出OSError或BlockingIOError异常。我们可以异常处理块中处理这些异常情况。...非阻塞I/O计算机编程中,阻塞I/O指的是当程序执行输入/输出操作时,如果没有立即获得所需结果,程序会被阻塞,等待结果返回。...而非阻塞I/O是一种异步I/O模型,它允许程序等待I/O操作完成期间继续执行其他任务,而不会被阻塞。 使用非阻塞I/O可以提高程序响应性能。...当需要进行非阻塞读取时,如果没有数据可用,read操作会立即返回并抛出OSError或BlockingIOError异常。这样程序就可以根据实际需求来处理这些异常情况。

1K30

并发篇-python非阻塞套接字-1

阻塞套接字到底带来了什么? 非阻塞套接字accept或recv时候不会发生阻塞,要么成功, 要么失败抛出BlockingIOError异常 使用非阻塞套接字实现并发 >并发是什么?...一个时间段,完成某件事 整体思路 > 吃满 CPU! > 宁可用 While True,也不要阻塞发呆! > 只要资源没到,就先做其别的事! > 将代码顺序重排,避开阻塞!...配合try语句,将代码顺序重排,避开阻塞 # 第一层循环只负责生成对等连接套接字 >>>While True : # 保留已经生成对等连接套接字 >>>connection_list.append...>这种缺陷是如何造成?...accept阻塞:当没有套接字连接请求过来时候会一直等待着 recv阻塞:当连接这个客户端没有发数据过来时候,也会一直等待着 非阻塞套接字——并发服务多个客户端

63730

python并发和异步编程实例

2、阻塞/非阻塞和同步/异步 这两对概念不是很好区分,从定义理解: 阻塞进行socket通信过程中,一个线程发起请求,如果当前请求没有返回结果,则进入sleep状态,期间线程挂起不能做其他操作...同步:同步和阻塞比较相似,但是二者并不是同一个概念,同步是指完成事件逻辑,是指一件事完成之后,再完成第二件事,以此类推… 异步:异步和非阻塞比较类似,异步概念和同步相对。...实际处理这个调用部件完成后,通过状态、通知和回调来通知调用者,实现异步方式通俗讲就是“等会再告诉你”。...2)非阻塞方式 实现非阻塞请求代码,与阻塞方式区别在于等待请求时并不挂起而是直接返回,为了确保能正确读取消息,最原始方式就是循环读取,知道读取完成为跳出循环,代码如下: def nonblocking_way...,但是并不明显,原因肯定是读取消息时候虽然不是在线程挂起时候而是循环读取消息时候浪费了时间,如果大部分时间读浪费了并没有发挥异步编程威力,解决办法就是后面要说【事件驱动】 3、回调、生成器和协程

96330

并发篇-python非阻塞套接字-2

不完美的CPU利用率 > 任何Python操作都是需要花费CPU资源 ! > 如果资源还没有到达,那么accept、recv以及send(connect没有完成时)操作都是无效CPU花费 !...> 对应BlockingIOError异常处理也是无效CPU花费 ! 如何提高CPU有效利用率呢?...IO多路复用 IO多路复用也是阻塞IO, 只是阻塞方法是select/poll/epoll, 好处就是单个进程可以处理多个socket 用select,poll,epoll监听多个io对象,当io对象有变化...但select,poll,epoll本质都是同步I/O,因为他们都需要在读写时间就绪后自己负责进行读写,也就是说这个读写过程是阻塞 因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个...目前 Linux 效率最高 IO多路复用 技术 ! epoll 基于惰性事件回调机制 惰性事件回调是由用户自己调用,操作系统只起到通知作用 ?

59230

Py异常处理

语句失败时引发 ±- AttributeError # 属性引用或赋值失败 ±- BufferError # 无法执行与缓冲区相关操作时引发 ±- EOFError # 当input()函数没有读取任何数据情况下达到文件结束条件...# 操作将阻塞对象(e.g. socket)设置为非阻塞操作 | ±- ChildProcessError # 子进程操作失败 | ±- ConnectionError # 与连接相关异常基类...| | ±- BrokenPipeError # 另一端关闭时尝试写入管道或试图已关闭写入套接字写入 | | ±- ConnectionAbortedError # 连接尝试被对等方中止 | |...(例如 os.remove()) | ±- NotADirectoryError # 不是目录事物请求目录操作(例如 os.listdir()) | ±- PermissionError # 尝试没有足够访问权限情况下运行操作...显然,Python无法这样做,因此你会将看到。编译时指出错误ZeroDivisionError是一个异常对象。 Python无法按照你要求去做,就会创建这种对象。

1.5K30

就这?Redis持久化策略——AOF

命令传播 命令传播:Redis 将执行完命令、命令参数、命令参数个数等信息发送到 AOF程序中 大家有没有关注到其中一个细节,AOF日志写入Redis成功执行命令之后才进行,为什么要在执行之后而不是之前呢...因为保存AOF日志部分工作也是由主线程完成(下文有详细介绍),Redis内存操作速度和文件写入速度简直是云泥之别,如果主线程文件保存过程中花费太长时间必然会阻塞后续操作。...但是,这时写入操作必须等待子线程先完成原本同步操作 ,因此这里写入操作会比平时阻塞更长时间。...因此AOFEverysec模式下只会丢失 1 秒钟数据说法实际并不准确。 Always 每个写命令执行完,立刻同步地将日志写回磁盘。...因为阻塞操作会让 Redis 主进程无法持续处理请求, 所以一般说来, 阻塞操作执行得越少、完成得越快, Redis 性能就越好。

49320

Redis详解(3)数据持久化机制

因为阻塞操作会让 Redis 主进程无法持续处理请求, 所以一般说来, 阻塞操作执行得越少、完成得越快, Redis 性能就越好。...2.数据安全:AOF数据安全性高于Snapshot存储,原因: Snapshot存储是基于累计批量思想,也就是说允许情况下,累计数据越多那么写入效率也就越高,但数据累计是靠时间积累完成...,那么如果在长时间数据不写入RDB,但Redis又遇到了崩溃,那么没有写入数据就无法恢复了,但是AOF方式偏偏相反,根据AOF配置存储频率策略可以做到最少数据丢失和较高数据恢复能力。...因此进行rewrite切换时可以更好保证数据安全性。 4). AOF包含一个格式清晰、易于理解日志文件用于记录所有的修改操作。事实,我们也可以通过该文件完成数据重建。...3、AOF持久化重写时,AOF重写缓冲区指令追加新文件和改名替换造成阻塞AOF持久化过程中,所有新来写入请求依然会被写入AOF文件,同时放到buffer中,当rewrite完成

69230

服务器宕机,Redis如何恢复数据?

无法通过后台数据库恢复情况下) 虽然不会阻塞当前命令执行,由于记录日志也是主线程中(Redis是单线程),如果日志写入磁盘时候突然阻塞了,肯定会影响下一个命令执行。...三种写回策略 AOF机制提供了三种回写策略,这些都在appendfsync配置,如下: Always(同步写回):命令执行完成,立马同步日志写入磁盘 Everysec(每秒写回):命令执行完成后,先将日志写入...AOF重写虽然能够缩减日志文件大小,达到减少日志记录和数据恢复时间,但是在数据量非常情况下把整个数据库重写后日志写入磁盘是一个非常耗时过程,难道不会阻塞主线程吗?...总结 AOF这种通过逐一记录操作命令日志方式,提供了三种写回策略保证数据可靠性,分别是Always、Everysec和No,这三种策略可靠性是从高到低,而在性能上则是从低到高。...子线程执行全量快照同时,主线程仍然接受着请求,读数据肯定没有问题,但是如果个修改了数据,如何能够保证快照完整性呢?

31720

混合模式程序集是针对“v2.0.50727”版运行时生成没有配置其他信息情况下无法 4.0 运行时中加载该...

今天把以前写代码生成工具从原来.NET3.5升级到.NET4.0,同时准备进一步完善,将程序集都更新后,一运行程序一处方法调用时报出了一个异常: 混合模式程序集是针对“v2.0.50727”版运行时生成...,没有配置其他信息情况下无法 4.0 运行时中加载该程序集 其调用方法是从sqlite数据库中获取原来已经使用过数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内...),而目前官方也没有给出最新.NET4数据访问支持。...既然出现这个问题,那肯定是GOOGLE搜索解决方案,毕竟微软不可能因为升级到了.NET4.0程序无法访问.NET2.0程序集吧。...后来著名stackoverflow.com果然找到了解决方案,就是app.config中添加一个配置节:startup <startup useLegacyV2RuntimeActivationPolicy

2.1K100

Redis 持久化: RDB 和 AOF

操作阻塞时间越长 将全量数据写入硬盘操作会占用大量带宽, 给硬盘带来很大压力, 从而影响 Redis 实例性能, 并且如果一次写入操作尚未完成, 就开始了下一次写入操作, 更有可能会造成恶性循环...相比, 使用 RDB 恢复大型数据集更快 缺点 RDB 方式实时性不够, 无法做到秒级持久化; RDB 需要 fork 子进程, 而 fork 进程执行成本非常高; RDB 文件是二进制编码, 没有可读性...AOF AOF (Append Only File) 通过写日志方式, Redis 每次写操作完成日志里记录下此次执行命令, 当服务器重启时候通过顺序地重放这些日志来恢复数据....写后日志 和 MySQL 写前日志 (Write-Ahead Logging) 不同, AOF 会在写操作完成后记录日志, 这样既能够保证 Redis 不阻塞并及时响应写操作, 还可以避免运行时检查出写操作命令不合法再回滚这条日志...然后, bgrewriteaof 子进程逐一把拷贝数据写成操作, 并记入重写日志, 因此重写过程中, 只有当 fork 操作发生时会阻塞主线程. 4 重启并加载 load Redis启动后通过loadDataFromDisk

31540

Redis 数据持久化?-----意外宕机如何避免数据丢失

,此时,因为命令没有记入日志,所以就无法日志进行恢复了。...这是因为,AOF 日志也是主线程中执行,如果在把日志文件写入磁盘时,磁盘写压力大,就会导致写盘很慢,进而导致后续操作也无法执行了。...这样一来,一个键值对重写日志中只用一条命令就行了,而且,日志恢复时,只用执行这条命令,就可以直接完成这个键值对写入了。 ?...然后,bgrewriteaof 子进程就可以不影响主线程情况下,逐一把拷贝数据写成操作,记入重写日志。 “两处日志”又是什么呢? 因为主线程未阻塞,仍然可以处理新来操作。...等到拷贝数据所有操作记录重写完成后,重写日志记录这些最新操作也会写入 AOF 文件,以保证数据库最新状态记录。此时,我们就可以用新 AOF 文件替代旧文件了。 ?

2K30

Redis 数据持久化?-----意外宕机如何避免数据丢失

,此时,因为命令没有记入日志,所以就无法日志进行恢复了。...这是因为,AOF 日志也是主线程中执行,如果在把日志文件写入磁盘时,磁盘写压力大,就会导致写盘很慢,进而导致后续操作也无法执行了。...这样一来,一个键值对重写日志中只用一条命令就行了,而且,日志恢复时,只用执行这条命令,就可以直接完成这个键值对写入了。...然后,bgrewriteaof 子进程就可以不影响主线程情况下,逐一把拷贝数据写成操作,记入重写日志。 “两处日志”又是什么呢? 因为主线程未阻塞,仍然可以处理新来操作。...等到拷贝数据所有操作记录重写完成后,重写日志记录这些最新操作也会写入 AOF 文件,以保证数据库最新状态记录。此时,我们就可以用新 AOF 文件替代旧文件了。

99700

Redis持久化 aof和rdb原理

,它会创建一个子进程,专门去把内存中数据库状态写入RDB文件,同时主进程还可以处理来自客户端请求命令,但子进程基本是复制父进程,这等于两个相同大小redis进程系统运行,会造成内存使用率大幅增加...命令重新加载Redis时 5.默认情况下执行shutdown命令关闭redis时,如果没有开启AOF持久化功能则自动执行 rdb优势和劣势 优势: 一旦采用该方式,那么你整个Redis数据库将只包含一个文件...由于该机制对日志文件写入操作采用是append模式,因此写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在内容。 如果日志过大,将自动启用rewrite机制。...事实,我们也可以通过该文件完成数据重建。 劣势: 对于相同数量数据集而言,AOF文件通常要大于RDB文件。RDB 恢复大数据集时速度比 AOF 恢复速度要快。...加载期间将会阻塞无法进行其它操作。 上述方法不行,或者恢复集群,可以使用redis-migrate-tool工具进行恢复。

46110

Python 实现 IO 多路复用

1.1 阻塞IO 默认形态,效率很低一种IO;常见阻塞场景: 因为某种条件没有达到造成阻塞,如:input accept recv 处理IO事件时间消耗较长带来阻塞,如:文件读写过程...,网络数据发送过程 1.2 非阻塞IO 通过修改IO事件属性,使其变为非阻塞状态,以避免条件阻塞情况。...非阻塞IO往往和循环搭配使用,这样可以不断执行部分需要执行代码,也不影响对阻塞事件判断。...以下示例通过s.setblocking(False)设置套接字为非阻塞套接字,并处理由此产生BlockingIOError异常: import socket from time import sleep...connect.close() s.close() 实现非阻塞另一种方式是将原本阻塞IO设置一个最长等待时间,规定时间达到条件则正常执行;如果过时仍未达到条件则阻塞结束。

62510
领券