学习twisted_1 基本

前言

也玩了蛮久的scrapy了,scrapy底层用到的twisted还是要学习一下的,了解原理能提高自己的技术水平的说

异步编程

如果在某程序的运行时,能根据已经执行的指令准确判断它接下来要进行哪个具体操作,那它是同步程序,反之则为异步程序。(无序与有序的区别)
大部分编程语言中对方法的调用是同步执行的。例如在线程执行体内,即线程的调用函数中,方法的调用就是同步执行的。如果方法需要很长的时间来完成,比方说从Internet加载数据的方法,调用者线程将被阻塞直到方法调用完成。如果不希望调用被阻塞,异步方法调用 它通过使用一种立即返回的异步的变量方法并提供额外的方法来支持接受完成通知以及完成等待 以优化改进长期运行的(同步)方法。

反应器模式 reactor pattern

反应器模式是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序
看英文版意思可能更清楚点
The reactor design pattern "Design pattern (computer science)") is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
反应器模式一定至少有一个在一直循环处理传入事件的loop

loop

基本使用

原理上的东西在写的时候可能更好的理解,先写个简单的程序吧

from twisted.internet import reactor

reactor.run()

twisted 就是一个反应堆模式,reactor是事件循环,而这正是twisted的核心,从文档和一些资料中我们知道

1.Twisted的reactor只有通过调用reactor.run()来启动。

2.reactor循环是在其开始的进程中运行,上面的代码也就是运行在主进程中。

3.一旦启动,就会一直运行下去。reactor就会在程序的控制下(或者具体在一个启动它的线程的控制下)。

4.reactor循环并不会消耗任何CPU的资源。

5.并不需要显式的创建reactor,只需要引入就OK了。

最后一条需要解释清楚。在Twisted中,reactor是单例模式,即在一个程序中只能有一个reactor,并且只要你引入它就相应地创建一个。

接下来就可以跑一个twisted的hello world

from twisted.internet import reactor

def hello():
    print("hello world")

reactor.callWhenRunning(hello)
reactor.run()

hello 方法就是我们说的回调方法了,reactor 不需要知道回调方法的细节,只需要知道是哪个回调方法

1.reactor模式是单线程的。

2.像Twisted这种交互式模型已经实现了reactor循环,意味无需我们亲自去实现它。

3.我们仍然需要框架来调用我们自己的代码来完成业务逻辑。

4.因为在单线程中运行,要想跑我们自己的代码,必须在reactor循>环中调用它们。

5.reactor事先并不知道调用我们代码的哪个函数

reactor 和我们自己的代码出了注册回调外,应该是毫无耦合

接下来写一个定时关闭reactor的例子

from twisted.internet import reactor

def hello():
    print("hello world")
    
def count(i):
    print(i)
    if i==5:
        reactor.stop()
    else:
        reactor.callLater(1,count,i+1)
        
reactor.callWhenRunning(hello)
reactor.callWhenRunning(count,1)
reactor.run()
print("reactor down")

上面这个程序,会在5s后关闭reactor,代码里使用了callLater函数为Twisted注册了一个回调函数 ,api可以查看文档twisted ReactorBase文档

有一个很好的地方就是twisted 里面做好了错误异常处理,如果回调函数里面有exception,twisted会捕捉到了并输出日志(所以scrapy spider中parse response的方法里面有错,也只会输出错误堆栈,而不会让爬虫挂掉)

结语

下一篇计划写下 twisted 的defer
先大体看下
异步编程中,defer机制主要是用来管理callback函数,在twisted中,许多功能的实现都是采用的事件驱动机制,在异步编程中,错误处理机制和同步程序并不一样,异步程序会无视错误执行下去。在异步程序中处理错误显得十分重要。defer就是来可以帮助我们来管理我们的callback和errback函数。合理的安排defer在异步编程中显得十分重要。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容