一、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的更多相关文章

  1. twisted reactor calllater实现

    twisted reactor calllater实现 1.      calllater实现代码 测试源码: from twisted.internet import reactor from tw ...

  2. twisted reactor 实现源码解析

    twisted reactor 实现源码解析 1.      reactor源码解析 1.1.    案例分析代码: from twisted.internet import protocol fro ...

  3. twisted reactor分析

    调用reactor.run(),就会调用到mainloop函数,从而调用到select或epoll,监控fd的读写. posixbase.py: def listenTCP(self, port, f ...

  4. twisted reactor执行流程

    #reactorbase的主循环 def mainLoop(self): while self._started: try: while self._started: # Advance simula ...

  5. 理解twisted中的reactor和deferred(一)

    Deferred是一个延迟加载对象,这个概念类似于tornado future,是调用异步操作返回的一个对象,其中包括了操作成功后的回调处理,错误后的回调处理. 简单讲,当我们需要执行一个耗时操作,比 ...

  6. 笔记-twisted源码-import reactor解析

    笔记-twisted源码-import reactor解析 1.      twisted源码解析-1 twisted reactor实现原理: 第一步: from twisted.internet ...

  7. Python Twisted系列教程4:由Twisted支持的诗歌客户端

    作者:dave@http://krondo.com/twisted-poetry/  译者:杨晓伟(采用意译) 你可以在这里从头开始阅读这个系列. 第一个twisted支持的诗歌服务器 尽管Twist ...

  8. 初始twisted(一)

    1.与同步模型的优势: 1.有大量的任务,一个时刻内至少有一个任务要运行 2.任务执行大量的I/O,同步模型会因为任务阻塞而浪费大量时间 3.任务之间相互独立,任务内部交互少. 2.与同步模式客户端的 ...

  9. 【转】Netty那点事(四)Netty与Reactor模式

    [原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch4-reactor.md 一:Netty.NIO.多线程? 时 ...

随机推荐

  1. 【UOJ#77】A+B Problem

    传送门 题目描述 略 Sol 看到选择黑白收益不同,然后还可能有代价. 我们想到用网络流解决,并且这应该是用总可能收益-最小割得到答案. 考虑初步建图,发现那个限制可以直接 \(n^2\) 解决. 我 ...

  2. redis主从+keepalived实现高可用技术

    Redis是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持,redis运行在内存拥有更快的读写.因为redis的表现如此出色,如何能保障redis在运行中能够应对宕机故障 ...

  3. 【leetcode】Find Largest Value in Each Tree Row

    You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...

  4. shiro框架学习-5-自定义Realm

    1. 自定义Realm基础 步骤: 创建一个类 ,继承AuthorizingRealm->AuthenticatingRealm->CachingRealm->Realm 重写授权方 ...

  5. 部署zabbix 4.0 + grafana

    不完整,仅供参考 Zabbix+grafana监控部署 基本环境 系统: CentOS Linux release 7.3.1611 Zabbix—server:  Zabbix_agent:   N ...

  6. BZOJ 2731 Luogu P3219 [HNOI2012]三角形覆盖问题 (扫描线)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=2731 (luogu)https://www.luogu.org/probl ...

  7. StringBuffer的s1.capacity()是多少?

    定义有StringBuffer s1=new StringBuffer(10);s1.append(“1234”)则s1.length()和s1.capacity()分别是多少? StringBuff ...

  8. 2018-2019-2 20165235《网络对抗技术》Exp7 网络欺诈防范

    2018-2019-2 20165235<网络对抗技术>Exp7 网络欺诈防范 实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法 实验内容 (1)简单应 ...

  9. Linux 下ThinkPHP项目出现_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450033aa87c28a760f4.php

    在Linux中部署了ThinkPHP项目,访问时却出现了_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450 ...

  10. Python locals() 的陷阱

    转载自https://segmentfault.com/a/1190000012724861 在工作中, 有时候会遇到一种情况: 动态地进行变量赋值, 不管是局部变量还是全局变量, 在我们绞尽脑汁的时 ...