Asyncio,asyncio

【Asyncio,asyncio】IO多路复用到底是不是异步的呢?
题主详细描述的“IO复用属于同步IO”大致上是没问题的 。你的迷惑关键在于没有注意到部分与整体的关系 。首先统一下对同步和异步的看法:同步/异步是协作机制,如果是和线程相关时,线程阻塞(sleep)或者空转(轮询)时可以看成是该线程在同步等待事件发生 。对于服务器网络模块设计来说,I/O多路复用必定会有一个轮询线程,这个线程可以看成同步的,它负责了全部的通信数据(请求)的接收 。
然后一般都是利用线程池的线程开始异步解析应用层协议消息,并进行请求的服务处理(当然考虑请求的性质,可能还会继续在服务内部进行并行处理) 。所以从整体请求处理的角度看,是异步的 。所以,你可以说IO复用是同步的,twisted是异步的 。I/O多路复用与I/O多路复用(I/O multiplexing)对应的是PPC和TPC模型,这里不展开 。
I/O多路复用目前有几种模型:select,poll ,pselect,epoll 。简要说下 。select:调用select(),调用线程一直循环阻塞等待消息,调用线程是同步的 。pselect:相比select提供了更精准的超时时间而已,调用线程是同步的 。poll :poll本质上和select没有区别,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,调用线程是同步的 。
epoll:同样需要一个线程在无限循环中调用epoll_wait等待注册的事件,调用线程是同步的 。他们之间的最大的区别,是文件描述符数量限制,文件描述符遍历、事件反馈机制方面的导致的cpu和内存资源消耗等方面 。所以linux的epoll和windows的完成端口都是高并发大量连接的服务器必须考虑的,也催生了libevent和libuv之类优秀的跨平台异步IO(这里的异步就是从并发请求处理来看的)库的产生 。
Java未来会不会淘汰,为什么这么多人觉得java过时了?
Java 过时了,但是,不会被淘汰 。不被淘汰,是因为历史原因,很多金融系统使用 Java Web 开发,是无法切换的 。倘若说彻底淘汰 Java,恐怕也需要 50 年以上,直到那些旧有的系统淘汰掉,同时新系统使用其他语言编写 。过时,是因为不知道是不是语言过于厚重,Java 到现在也无法支持 async/await 或者协程,Java 在非阻塞 IO 方面停滞不前,流行的spring 和 jdbc 都是阻塞 IO,这让 Java 比起 Nodejs,Go 效率低下,虽然可以使用 nginx 之类的非阻塞负载均衡器抵消这种影响,但是却更耗费硬件资源 。
比方说,Java Spring 写的服务,用 8 个 cpu 跑满后面的数据库读写,而 Nodejs Go 只需要 2 个 cpu 。备注: Java netty 受制于 Java 语言,不支持 async await,也不支持协程,使用 netty 你面临 callback hell,另外,非阻塞数据库连接规范 rdbc 至今仍然不成熟,代码仓库不完备,缺乏足够测试,缺乏应用,而 jdbc 仍然是阻塞 IO,所有基于 jdbc 的软件库都不适用 netty 。

    推荐阅读