在Python中,你使用socket.setblocking(0)使它无阻塞。在C中,它更复杂,(一方面,你需要在BSD风格O_NONBLOCK和几乎不可区分的Posix风味O_NDELAY之间进行选择,这完全不同于TCP_NODELAY),但它是完全相同的想法。你在创建套接字之后,但在使用之前这样做。 (实际上,如果你坚果,你可以来回切换。)

主要的机械差异是send,recv,connect和accept可以返回而没有做任何事情。你有(当然)一些选择。你可以检查返回码和错误代码,一般驱使自己疯了。如果你不相信我,试试它。你的应用程序将增长,bug和吸CPU。所以,让我们跳过脑死亡的解决方案,make it right。

使用select。

在C中,select编码相当复杂。 在Python中,它很简单,而且它足够接近C版本,如果你理解在Python中的select,你会有很少的麻烦在C

ready_to_read, ready_to_write, in_error = \
select.select(
potential_readers,
potential_writers,
potential_errs,
timeout)

  

你传递选择三个列表:第一个包含您可能想要尝试阅读的所有套接字;第二个所有的套接字你可能想尝试写入,最后一个(通常留空)那些你想检查错误。你应该注意一个套接字可以进入多个列表。选择调用正在阻塞,但您可以给它一个超时。这通常是一个明智的事情 - 给它一个很长的超时(说一分钟),除非你有很好的理由,否则。

作为回报,你会得到三个列表。它们包含实际可读,可写和错误的套接字。这些列表中的每一个都是传入的相应列表的子集(可能为空)。

如果一个套接字在输出可读列表中,您可以像我们一直在这个业务中那样接近,那么该套接字上的recv会返回一些东西。可写列表的想法相同。你可以发送东西。也许不是你想要的,但有些事情比没有好。 (实际上,任何合理健康的套接字将返回为可写 - 它只是意味着出站网络缓冲区空间可用。)

如果你有一个“服务器”套接字,将其放在potential_readers列表中。如果它出现在可读列表中,你的接受(几乎肯定)工作。如果您创建了一个新的套接字以连接到其他人,请将其放在potential_writers列表中。如果它显示在可写的列表中,你有一个体面的机会,它已经连接。

一个非常讨厌的问题与选择:如果在那些输入列表中的插座是一个死了一个讨厌的死亡,选择将失败。然后,你需要循环通过所有这些列表中的每个单独的套接字,并做一个select([sock],[],[],0),直到你找到了坏的。超时为0意味着它不会需要很长时间,但它是丑陋的。

实际上,即使使用阻塞套接字,选择也可以方便。这是一种确定是否阻塞的方法 - 当缓冲区中有某些东西时,套接字返回可读。然而,这仍然不能帮助确定另一端是完成还是只忙于其他事情的问题。

Python非阻塞网络通信Howto的更多相关文章

  1. Java入门系列-25-NIO(实现非阻塞网络通信)

    还记得之前介绍NIO时对比传统IO的一大特点吗?就是NIO是非阻塞式的,这篇文章带大家来看一下非阻塞的网络操作. 补充:以数组的形式使用缓冲区 package testnio; import java ...

  2. python socket非阻塞及python队列Queue

    一. python非阻塞编程的settimeout与setblocking+select 原文:www.th7.cn/Program/Python/201406/214922.shtml 侧面认证Py ...

  3. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  4. 异步非阻塞IO的Python Web框架--Tornado

    Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBo ...

  5. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  6. Python 命令行非阻塞输入

    很久很久以前,系windows平台下,用C语言写过一款贪食蛇游戏,cmd界面,用kbhit()函数实现非阻塞输入.系windows平台下用python依然可以调用msvcrt.khbit实现非阻塞监听 ...

  7. Python番外之 阻塞非阻塞,同步与异步,i/o模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  8. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  9. JAVA NIO学习三:NIO 的非阻塞式网络通信

    紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...

随机推荐

  1. 简单的ATM,见笑见笑

    #include<stdio.h>#include<string.h> void main(){  char a[4]={0}; char e[]="9527&quo ...

  2. github代码收集推荐

    https://github.com/AFNetworking/AFNetworkinghttps://github.com/jessesquires/JSQMessagesViewControlle ...

  3. jQuery原生框架-----------------核心框架

    // 1.自调防止全局变量污染(function( window ) { var version = '1.0.0'; var document = window.document; var arr ...

  4. android中所有颜色大全

    < ?xml version="1.0" encoding="utf-8" ?>       < resources>< colo ...

  5. YARN资料收集

    hdfs2的HA:  http://www.cnblogs.com/meiyuanbao/p/hadoop2.html

  6. 删除hao123这个恶心的毒瘤

    最近做服务器,好好一个东西莫名其妙的被染上了这个狗皮膏药......然后我就用了各种手段删除,注册表.组策略等等都用上了,却没有丝毫办法.....最后发现的地方特别无语,居然在快捷方式的属性中加上了u ...

  7. 认识Java

    java出生地:SUN Microsystems Inc<开源>     -SUN : Standford University Network java之父:James Gosling ...

  8. Android下使用Properties文件保存程序设置

    原文:http://jerrysun.blog.51cto.com/745955/804789 废话不说,直接上代码.    读取.properties文件中的配置: String strValue ...

  9. BackTrack5-r3虚拟机安装

    ISOL INUX 3.63 Debian-2008-07-15 Copyright (C) 1994-2008 H. Peter Anvinboot:(按回车) 选择:BackTrack Text ...

  10. OD调试17

    程序先出现一个nag 然后出现主窗口 然后出现第二个nag窗口        我们查个壳   没有壳 那就载入OD看看,继续用调用堆栈的方法 发现一直执行用的都是这一个call,最后执行到程序结束.之 ...