在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. 打不开tomcat

    org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 59; schema_reference.4: 无法读取方案文档 'http: ...

  2. SparkSQL读取Hive中的数据

    由于我Spark采用的是Cloudera公司的CDH,并且安装的时候是在线自动安装和部署的集群.最近在学习SparkSQL,看到SparkSQL on HIVE.下面主要是介绍一下如何通过SparkS ...

  3. matlab初学之textread

    文章出处:http://blog.sina.com.cn/s/blog_9e67285801010bju.html 基本语法是: [A,B,C,-] = textread(filename,forma ...

  4. 【zz】Matlab 二值图像形态学函数 bwmorph

    原文地址:http://blog.sina.com.cn/wind8961 函数功能: 对二值图像进行数学形态学(Mathematical Morphology)运算. 语法格式: BW2 = bwm ...

  5. php 数据库备份、还原

    1. mydb.php //DB类 2. backup.php //备份脚本 3. restore.php //还原脚本 mydb.php <? class db{ var $linkid; v ...

  6. 【汇总】Android 常用方法整理

    1.解决ActionBar OverFlow按钮不显示.(在oncreate中调用即可) private void setOverflowShowingAlways() { try { ViewCon ...

  7. javac找不到或无法加载主类 com.sun.tools.javac.Main

    在安装jdk后或者以前安装了jdk某时使用javac编译java文件时出现找不到或无法加载主类com.sun.tools.javac.Main,这个问题时,网上一般都说是环境变量配置不对,这样的说法其 ...

  8. 安装mongodb 远程服务器报错

    安装的时候百度了各种教程 就是装不上 结果原因看下图吧  后面这神秘代码是什么鬼 加上后就能正常下载了

  9. JQUERY 知识点的自我总结

    一.名词释义 1 .js的入口函数:要等待文档树的加载完成,并且等待所有图片.文件都加载完成之后才开始执行. 2  .jquery入口函数会等待文档树的加载完成,并不会等待图片还有文件的加载 3 .j ...

  10. Azure自动化实例: 复制blog用于备份

    在Azure 自动化:使用PowerShell Credential连接到Azure, 之后, 我在项目中遇到了实现blog备份的任务, 现将其作为一个实例写下来: 1. 首先,创建自动化帐户, 在资 ...