processpool

tornado常见的异步非堵塞写法

倾然丶 夕夏残阳落幕 提交于 2019-12-21 10:52:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 非堵塞和异步有什么区别? 非堵塞 在tornado的框架中非堵塞一般指得是网络I/O层面的socket数据接收模式(select或者epoll),不论用哪个模式,最终程序都会收到数据并处理数据(这个数据要么被转发、要么被解析和处理)。 非堵塞的弊端: 如果处理一个密集计算的请求需要花费10秒钟(就是堵塞了10秒钟),当两个或多个请求同时到达时,只要第一个被接受处理没结束,其他全部请求都要等,并且挨个挨个等到被轮询结束。这就是单线程事件还回机制(非堵塞机制), 对堵塞零容忍, 任何一个地方堵住了还回线程,其他全部请求都被堵住。 也就是说采用了非堵塞模式之后,最好不要用堵塞(常规解析数据的函数)的代码块来解析数据。 异步 异步的作用是将堵塞代码错开来,不放在当前接受数据的线程中处理, 要么丢到rabbitmq/zeromq/activemq中交给另外一个进程去处理,要么用其他线程或进程来处理。 让监听数据的这个socket收到数据后直接抛给其他程序来处理,然后立马保持监听状态,这样子程序的循环能力就非常强。 再就是要提的一点,tornado本身的ioloop就采用epool/select/kqueue来完成非堵塞动作,咱们使用tornado只要把异步的代码写好就可以很好的发挥出tornado的优势了。