(三)认识twisted reactor
一、reactor是单线程模型,简单粗暴,也就是说网络IO和我们的业务逻辑一般是在一个线程里,其中网络IO通过event loop的方式去异步执行,效率也很高。看下官网的这幅图,比较清晰

twisted主要帮我们处理的事情就是去监听socket,等待事件完成触发回调,然后回到我们的业务逻辑中。
可以看出,由于业务逻辑和网络异步IO都在reactor线程里,当业务逻辑比较耗时(如复杂计算,SQL慢)的时候,twisted帮不到我们,需要我们自己去解决,如用线程池去跑费时任务,防止阻塞reactor主线程。
二、reactor提供了较丰富的方法供我们调用,常用的如下:
reactor.callInThread: 可以新起一个线程,用来处理耗时逻辑,需注意线程安全
reactor.callFromThread: 和上面相反,在别的线程调用,去回到reactor主线程执行逻辑
threads.deferToThread: 将任务放到线程池去执行 以免阻塞主线程,特点是返回的是deferred对象,这样我们可以加入回调逻辑
reactor.suggestThreadPoolSize: 设置线程池线程数
reactor.run/stop 启动、停止主线程
reactor.callLater 延迟执行
reactor.callFromRunning 立刻执行
三、 看下小例子
# -*- coding:utf-8 –*-
import threading
import time
from twisted.internet import reactor, threads thread = threading.current_thread() def leaveReactor():
print "[%s]等待3秒,当前线程:%s"%(nowtime(),threading.current_thread().getName())
time.sleep(3)
reactor.callFromThread(backReactor) def backReactor():
print "[%s]回到reactor,线程:%s"%(nowtime(),threading.current_thread().getName()) def deferReactor():
time.sleep(3)
return "asyJob" def handle_success(x):
print "[%s]回调成功 :%s "%(nowtime(),x) def work():
reactor.callInThread(leaveReactor)
d = threads.deferToThread(deferReactor)
d.addCallback(handle_success)
print "[%s] 主线程:%s"%(nowtime(),threading.current_thread().getName()) def nowtime():
return time.strftime('%Y-%m-%d,%X', time.localtime()) if __name__ == '__main__':
reactor.suggestThreadPoolSize(8)
reactor.callWhenRunning(work)
reactor.run()
(三)认识twisted reactor的更多相关文章
- twisted reactor calllater实现
twisted reactor calllater实现 1. calllater实现代码 测试源码: from twisted.internet import reactor from tw ...
- twisted reactor 实现源码解析
twisted reactor 实现源码解析 1. reactor源码解析 1.1. 案例分析代码: from twisted.internet import protocol fro ...
- twisted reactor分析
调用reactor.run(),就会调用到mainloop函数,从而调用到select或epoll,监控fd的读写. posixbase.py: def listenTCP(self, port, f ...
- twisted reactor执行流程
#reactorbase的主循环 def mainLoop(self): while self._started: try: while self._started: # Advance simula ...
- 理解twisted中的reactor和deferred(一)
Deferred是一个延迟加载对象,这个概念类似于tornado future,是调用异步操作返回的一个对象,其中包括了操作成功后的回调处理,错误后的回调处理. 简单讲,当我们需要执行一个耗时操作,比 ...
- 笔记-twisted源码-import reactor解析
笔记-twisted源码-import reactor解析 1. twisted源码解析-1 twisted reactor实现原理: 第一步: from twisted.internet ...
- Python Twisted系列教程4:由Twisted支持的诗歌客户端
作者:dave@http://krondo.com/twisted-poetry/ 译者:杨晓伟(采用意译) 你可以在这里从头开始阅读这个系列. 第一个twisted支持的诗歌服务器 尽管Twist ...
- 初始twisted(一)
1.与同步模型的优势: 1.有大量的任务,一个时刻内至少有一个任务要运行 2.任务执行大量的I/O,同步模型会因为任务阻塞而浪费大量时间 3.任务之间相互独立,任务内部交互少. 2.与同步模式客户端的 ...
- 【转】Netty那点事(四)Netty与Reactor模式
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch4-reactor.md 一:Netty.NIO.多线程? 时 ...
随机推荐
- 集合综合练习<四>
package com.JiHeTotal; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io. ...
- pyqt5-QTDesigner--控件操作
Edit菜单 编辑小伙伴.用鼠标直接拖 编辑控件---样式等等. 点击需要编辑的控件---> 信号与槽 先用鼠标从控件往外拖---> --->选中相应的信 ...
- Jenkins-ssh远程执行nohup- java无法退出
一,初步 #执行方式 ssh 192.168.2.103 " nohup java -jar /home/a/ipf/ight/feedback/ixxxedback-platform-1. ...
- [POJ]P3126 Prime Path[BFS]
[POJ]P3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35230 Accepted: ...
- 185.[USACO Oct08] 挖水井 (第三次考试大整理)
185. [USACO Oct08] 挖水井 输入文件:water.in 输出文件:water.out 简单对比 时间限制:1 s 内存限制:128 MB 农夫约翰决定给他的N(1< ...
- 珍珠x
题目描述 有n颗形状和大小都一致的珍珠,它们的重量都不相同.n为整数,所有的珍珠从1到n编号.你的任务是发现哪颗珍珠的重量刚好处于正中间,即在所有珍珠的重量中,该珍珠的重量列(n+1)/2位.下面给出 ...
- HDU 2923 Relocation(状压dp+01背包)
题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...
- [CSP-S模拟测试]:bird(线段树优化DP)
题目传送门(内部题89) 输入格式 第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间.接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标. 输出格式 输出一个 ...
- 测试常用linux命令之sed篇
一.sed命令 可以放在单独的脚本文件中执行:sed -f script1 data1 多条命令也可以用{}括起来 sed可以进行文本的替换,删除,行添加,打印等.采用 sed [address]{c ...
- 前端每日实战:161# 视频演示如何用纯 CSS 创作一张纪念卓别林的卡片(没有笑声的一天就是被荒废的一天)
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WaaBNV 可交互视频 此视频是可 ...