并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。...要完成这样的操作,有人使用MSG_PEEK标志调用recv()函数查看缓冲区中是否有数据可读。同样,这种方法也不好。...因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接字的“I/O模型”来判断非阻塞套接字是否可读可写。 ...使用非阻塞模式套接字,需要编写更多的代码,以便在每个Windows Sockets API函数调用中,对收到的WSAEWOULDBLOCK错误进行处理。...这种套接字在使用上存在一定难度,但只要排除了这些困难,它在功能上还是非常强大的。通常情况下,可考虑使用套接字的“I/O模型”,它有助于应用程序通过异步方式,同时对一个或多个套接字的通信加以管理。
Linux epoll的好处 示例2中显示的套接字称为阻塞套接字,因为Python程序会停止运行直到事件发生。...第21行中的send()调用将阻塞,直到Linux将所有返回给客户端的数据排队等待准备传输。 当程序使用阻塞套接字时,它通常使用一个线程(甚至是专用进程)在每个套接字上进行通信。...而是,程序在异步套接字上执行一个操作,并立即通知该操作成功还是失败。 该信息使程序可以决定如何进行。 由于异步套接字是非阻塞的,因此不需要多个执行线程。 所有工作都可以在单个线程中完成。...epoll和poll比select更好,因为Python程序不必检查每个套接字中是否有感兴趣的事件。 相反,它可以依靠操作系统来告诉它哪些套接字可能发生这些事件。...epoll比poll更好,因为它不需要操作系统每次在Python程序查询时都检查所有套接字中是否有感兴趣的事件。 相反,Linux会跟踪这些事件的发生情况,并在由Python查询时返回一个列表。
并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。...因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接字的“I/O模型”来判断非阻塞套接字是否可读可写。...非阻塞模式套接字与阻塞模式套接字相比,不容易使用。...使用非阻塞模式套接字,需要编写更多的代码,以便在每个Windows Sockets API函数调用中,对收到的WSAEWOULDBLOCK错误进行处理。因此,非阻塞套接字便显得有些难于使用。...但是,非阻塞套接字在控制建立的多个连接,在数据的收发量不均,时间不定时,明显具有优势。这种套接字在使用上存在一定难度,但只要排除了这些困难,它在功能上还是非常强大的。
并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。...因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接字的“I/O模型”来判断非阻塞套接字是否可读可写。...非阻塞模式套接字与阻塞模式套接字相比,不容易使用。...使用非阻塞模式套接字,需要编写更多的代码,以便在每个Windows Sockets API函数调用中,对收到的WSAEWOULDBLOCK错误进行处理。...这种套接字在使用上存在一定难度,但只要排除了这些困难,它在功能上还是非常强大的。通常情况下,可考虑使用套接字的“I/O模型”,它有助于应用程序通过异步方式,同时对一个或多个套接字的通信加以管理。
问题描述:在编写书稿和反复修改书稿时,很容易有多字的情况,例如“用户的的资料”、“需要需要用户输入”,这些不小心的错误用肉眼很难完全发现。但是设定好规则之后,代码是可以非常忠实地完成这个任务的。...首先使用代码发现可疑字词,然后再人工确认,可以大幅度提高工作效率。...技术要点:1)正则表达式中[]表示范围;2)正则表达式元字符\num表示序号为num的子模式,其中整个正则表达式序号为0,第一个子模式序号为1,以此类推;3)正则表达式元字符?...表示前面的字符可以出现也可以不出现;4)常用汉字的Unicode编码范围为\u4e00-\u9fa5;5)Python扩展库python-docx用来读写Word文档。 参考代码: ? 运行结果: ?
I/O复用的典型应用场景 针对网络应用场景,有以下情形, 上面讨论过的客户同时处理多个描述字时(一般是交互式输入和网络套接口),此时必须使用I/O复用。 一个TCP客户同时处理多个套接口。...《Unix网络编程》一书中,前五章的所有例子都使用阻塞I/O模型。 为了阐述简单,这里以UDP套接口作为例子,将函数recvfrom视为系统调用,它会有从应用进程中运行和内核中运行的相互切换。...轮询 当一个应用进程对一个非阻塞描述字巡回调用recvfrom时,我们称此过程为轮询(polling)。应用进程连续不断地查询内核,数据是否准备好,这对CPU时间是极大的浪费。...例如,阻塞于select调用,等待数据报套接口(可以是多个中任意一个)可读,函数返回对应标识,此时便可调用recvfrom将数据报拷贝到应用缓冲区中。...[I/O复用模型] 尽管多了一次系统调用,但是select函数可以等待多个套接口描述字这一点,是使用I/O复用模型的一大理由。
什么是非阻塞?...此期间可以将三次握手迭合在其他处理上 利用非阻塞 connect 技术同时建立多个连接 利用 select 指定时间限制,缩短connect的超时(很多实现中connect超时为75秒到数分钟) 1.设置套接口为非阻塞...2.发起非阻塞 connect 3.等待连接建立期间完成其他事情 4.检查连接是否立即建立 5.调用 select 6.处理 select 超时 7.检查可读可写条件,调用 getsockopt 查看连接是否成功...一个线程维护多个 Socket 由于 socket 是文件描述符,因而某个线程盯的所有的 socket,都放在一个文件描述符集合 fd_set 中,这就是项目进度强,然后调用 select 函数来监听文件描述符集合是否有变化...fd 是否在 fdset 中(而不是看是否为1?
ServerSocket 用于绑定端口号 ; ② 获取服务器套接字 : 可以通过服务器套接字通道的 serverSocketChannel.socket() 方法获取 ServerSocket ; ③...: 并设置该通道网络通信模式为非阻塞模式 serverSocketChannel.configureBlocking(false) , 注意这里设置了非阻塞模式 , 其 对应的客户端套接字通道 SocketChannel...select 方法 ( 3 种 阻塞 / 非阻塞 监听方法 ) 监听 , 那么就会解除阻塞 ( 如果之前发生监听阻塞 ) , 返回触发事件的个数 ; 3 ....通道 , 该方法是非阻塞的 , 因为该事件触发时已经知道有客户端连接 , 这里只是响应客户端的连接 ; ③ 设置非阻塞网络通信模式 : : sc.configureBlocking(false) 设置该通道是非阻塞通道...NIO 通信 客户端 流程说明 ---- NIO 网络通信 客户端 操作流程 : 首先创建客户端套接字通道 , 设置该通道为非阻塞通信模式 , 连接服务器的指定端口号 , 连接成功后 , 写出数据到服务器中
) 是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。...接收TCP 客户的连接(阻塞式)等待连接的到来 sk.connect(address) 连接到address处的套接字。...其中data是包含接收数据的字符串,address是发送数据的套接字地址。 sk.send(string[,flag]) 将string中的数据发送到连接的套接字。...一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s ) sk.getpeername() 返回连接套接字的远程地址。...、当 参数3 序列中的句柄发生错误时,则将该发生错误的句柄添加到 返回值3 序列中 4、当 超时时间 未设置,则select会一直阻塞,直到监听的句柄发生变化 5、当 超时时间 = 1时,那么如果监听的句柄均无任何变化
非阻塞 IO 当我们调用套接字的读写方法,默认它们是阻塞的,比如 read 方法要传递进去一个参数 n,表示读取这么多字节后再返回,如果没有读够线程就会卡在那里,直到新的数据到来或者连接关闭了,read...而 write 方法一般来说不会阻塞,除非内核为套接字分配的写缓冲区已经满了,write 方法就会阻塞,直到缓存区中有空闲空间挪出来了。...非阻塞 IO 在套接字对象上提供了一个选项 Non_Blocking,当这个选项打开时,读写方 法不会阻塞,而是能读多少读多少,能写多少写多少。...它们使用起来可能在形式上略有差异,但是本质上都是差不多的,都可以使用上面的伪代码逻辑进行理解。 服务器套接字 serversocket 对象的读操作是指调用 accept 接受客户端新连接。...比如定时任务就是非常重要的一件 事。如果线程阻塞在 select 系统调用上,定时任务将无法得到准时调度。那 Redis 是如何解决这个问题的呢?
如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。...如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。...如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。...WSAEINTR:阻塞进程被WSACancelBlockingCall()取消。 WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。...WSAESHUTDOWN:套接口已被关闭。当一个套接口以0或2的how参数调用shutdown()关闭后,无法再用recv()接收数据。
非阻塞式 I/O 03% select 26% 使用 select 的并发服务器 35% 同步、异步、事件驱动、回调 70% select 的局限 75% epoll 81% 编译自 https://...阻塞式 I/O 更好理解,因为这是我们使用 I/O 相关 API 时的“标准”方式。从套接字接收数据的时候,调用 函数会发生阻塞,直到它从端口上接收到了来自另一端套接字的数据。...这是代码: 这里与阻塞版本有些差异,值得注意: 函数返回的 套接字因调用了 , 被设置成非阻塞的模式。 检查 的返回状态时,我们对 进行了检查,判断它是否被设置成表示没有可供接收的数据的状态。...这里就实现了使用非阻塞的 让监听者检查套接字变为可能,并且在没有数据的时候重新获得控制权。换句话说,用编程的语言说这就是轮询polling—— 主程序周期性的查询套接字以便读取数据。...这个调用意味着客户端连接到套接字上,发送某些数据,并且对套接字上 的调用不会被阻塞注6。这个回调函数返回结构体 。 这个结构体告诉主循环,是否应该监视套接字的读取事件、写入事件,或者两者都监视。
accept 不再阻塞,当然如果wait_seconds == 0 则像正常模式一样,accept 阻塞等待,注意,accept 返回的是已连接套接字。...此后调用select与前面3个函数类似,但这里关注的是可写事件,因为一旦连接建立,套接字就可写。...还需要注意的是当select 返回1,可能有两种情况,一种是连接成功,一种是套接字产生错误,由这里可知,这两种情况都会产生可写事件,所以需要使用getsockopt来获取一下。...退出之前还需重新将套接字设置为阻塞。...如果 fd 是 阻塞的,则 connect 会一直等到超时或者连接成功返回;如果 fd 是非阻塞的,则 connect 会立刻返回,但此时协议栈是否已经完成连接要判断下返回值和 errno;无论 fd
非阻塞IO往往和循环搭配使用,这样可以不断执行部分需要执行的代码,也不影响对阻塞事件的判断。...以下示例通过s.setblocking(False)设置套接字为非阻塞套接字,并处理由此产生的BlockingIOError异常: import socket from time import sleep...python中实现IO多路复用: select poll epoll 2.1 select r,w,x = select(rlist,wlist,xlist,timeout):向内核发起IO...r : rlist中准备就绪的IO列表 w: wlist中准备就绪的IO列表 x: xlist中准备就绪的IO列表 注意事项: IO多路复用不应该有死循环出现,使一个客户端长期占有服务端...文件描述符查找套接字的字典 fdmap = {s.fileno():s} #注册关注的IO事件 p.register(s,select.POLLIN | select.POLLERR) while True
多线程模块能够更加高效得完成任务,但是在PyQt 应用程序中实现多线程可以使用 Qt 的线程模块(QThread)或者 Python 的 threading 模块。...Twisted 或非阻塞套接字/select:可以考虑使用 Twisted 或非阻塞套接字/select 实现非阻塞 I/O。Diesel 库:它目前仅限于 Linux,但它的速度非常快且非常优雅。...Python 线程是否会调用它们,尽管很容易为 connect() 添加一个参数。...如果 Qt 线程不调用 Python 代码,则它们应该能够并发运行(除了可能在各种结构中实现的各种额外锁之外)。...通过上述了解,我们应该清晰得知道,如果你的应用程序主要是 CPU 密集型任务,可能更倾向于使用 multiprocessing 模块。
不管使用什么样的网络模型,不管使用的是阻塞IO还是非阻塞IO,不管是同步IO还是异步IO,都需要关注这四个问题。...EADDRNOTAVAIL 套接字未绑定到地址,在尝试将其绑定到临时端口时,确定临时端口范围内的所有端口号当前都在使用中。...EAFNOSUPPORT 传递的地址在其sa_family字段中没有正确的地址族。 EAGAIN 路由缓存中的条目不足。 EALREADY 套接字是非阻塞的,以前的连接尝试尚未完成。...EINPROGRESS 套接字是非阻塞的,无法立即完成连接。 EINTR 系统调用被捕获的信号中断;参见信号(7)。 EISCONN 套接字已连接。 ENETUNREACH 网络无法访问。...原理图如下: 2.1.2 非阻塞模式 连接的fd的阻塞属性决定了IO函数是否阻塞。默认情况下fd是阻塞的,要设置非阻塞模式,可以使用一下方式: //......
启动通道并注册选择器 启动模式 感谢Java一直在持续更新,对应的各个API也做得越来越好了,我们本次生成 服务端套接字通道 也是使用到JDK提供的一个方式 open ,我们将启动一个 ServerSocketChannel...服务端套接字通道 是否阻塞模式。...让我们看看源码中对于这个方法 select 的注释吧。.... */ public abstract int select() throws IOException; } 好的,看样子是对的,它将返回一组套接字通道已经准备好执行I/O操作的键...以Key的形式存储,这时我们需要 对其进行判断 ,是否是已经就绪可以被接受的连接,如果是,这时我们需要 获取这个连接 ,同时也将其设定为 非阻塞的状态 ,并将它 注册到选择器上(当然,这时的标识就不能是一开始的
第一个参数指定内核关注描述字的边界,值是集合中最大的描述字加1,内核会从0开始,依次测试边界内的所有描述字。例如,对于上面{1,4,5}的描述字集合,第一个参数的值应该是6。...什么是“描述字准备好” 前面一直讨论的“描述字准备好”,在select函数处理的时候,具体条件如下: 准备好读 下面四个条件任意满足一个,套接口准备好读: 套接口接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮限度...“描述字准备好”总结 对select来说套接口准备好的条件的总结如下, 条件 是否可读 是否可写 是否异常 有数据可读 是 关闭连接的读一半 是 给监听套接口准备好新连接 是 有可用于写的空间...原来版本的问题在于套接口上发生事件时,阻塞于fgets调用的客户端无法及时处理。新版本则阻塞于select调用,无论是标准输入,还是套接口事件,客户端都可以及时处理。...[函数str_cli中由select处理的条件] 修改函数str_cli [str_cli函数select版本与初始版本对比] 使用函数select 在新版的str_cli函数中,使用select函数,
参考一: Select模型与ioctlsocket的使用方法 int iMode = 1; //0:阻塞 ioctlsocket(socketc,FIONBIO, (u_long FAR*) &...readfds指定一個Socket数组(应该是一个,但这里主要是表现为一个Socket数组),select检查该数组中的所有Socket。...如果成功返回,则readfds中存放的是符合‘可读性’条件的数组成员(如缓冲区中有可读的数据)。 writefds指定一个Socket数组,select检查该数组中的所有Socket。...WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 WSAENOTSOCK:描述字不是一个套接口。...WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 WSAENOTSOCK:描述字不是一个套接口。
领取专属 10元无门槛券
手把手带您无忧上云