前言:

学习了golang的goruntine后,再回过头来看twisted网络编程库中的异步应用,没事琢磨下,以前搞过一个twisted做负载分发,性能差的要命,这几天再搞搞,看看能不能做少许提升。

说正题:

先介绍下twisted的几个的概念

twisted有个defer的概念,说来golang也有个defer,只是golang的是和panic recover配合做异常捕获的。 twisted的defer是异步的一种变现方式,可以这么理解,他和thread的区别是,他是基于时间event的。

有了deferred,即可对任务的执行进行管理控制。防止程序的运行,由于等待某项任务的完成而陷入阻塞停滞,提高整体运行的效率。

Deferred能帮助你编写异步代码,但并不是为自动生成异步或无阻塞的代码!要想将一个同步函数编程异步函数,必须在函数中返回Deferred并正确注册回调。

事件的好处,有堵塞io的操作的时候,我把这个任务扔到后面执行,当io执行好了后,我再继续计算刚才那个事 .

callback链表有三个形式,正常结束,例外结束,任意状态,他们分别调用会调用 addCallback\addErrback\addBoth注册到链表中。 特意说下,addBoth是任何的状态也都会执行

这里再说下,twsited的线程。reactor.callFromThread 是由reactor.run 搞出来的,所以你做好状态用reactor.stop可以控制他的关闭,就是因为他是由reactor.run派出来的进程,所以会堵塞主任务线程的,然而reactor.callInThread是一个个的独立的线程,他不堵塞了,但是他也无法stop了。。。。

#coding=utf-8
from twisted.internet import reactor
#xiaorui.cc
import time
reactor.suggestThreadPoolSize(30)
def tt(i,j):if i =="10":reactor.stop()while 1:print i,'---------------',jtime.sleep(2)
def gg(i,j):time.sleep(2)if i ==10:reactor.stop()print i,'---------------',jtime.sleep(2)
for i in range(50):
#    reactor.callFromThread(gg,i,i)reactor.callInThread(tt,i,i)
print "I want to start"
reactor.run()

原文: http://rfyiamcool.blog.51cto.com/1030776/1386786

twisted自带了一个顺序执行的组件叫做 callLater, 我们可以规定第一秒执行这个函数,第二秒执行那个函数,第三秒的时候关闭realor ! 干脆点,你可以想成是计划任务。

from twisted.internet import reactor
import time
def printTime():print 'Current time is',time.strftime("%H:%M:%S")
def stopReactor():print "Stopping reactor"reactor.stop()
reactor.callLater(1,printTime)
reactor.callLater(2,printTime)
reactor.callLater(3,printTime)
reactor.callLater(4,printTime)
reactor.callLater(5,stopReactor)
print 'Running the reactor ...'
reactor.run()
print 'Reactor stopped.'

下面的例子,你们自己跑跑,我上面说的都是一些个零散的例子,大家对照下面完整的,走一遍。 twisted理解其实却是有点麻烦,大家只要知道他是基于事件的后,慢慢理解就行了。

#coding:utf-8
#xiaorui.cc
from twisted.internet import reactor, defer
from twisted.internet.threads import deferToThread
import os,sys
from twisted.python import threadable; threadable.init(1)
deferred =deferToThread.__get__
import time
def todoprint_(result):print result
def running():"Prints a few dots on stdout while the reactor is running."
#     sys.stdout.write("."); sys.stdout.flush()print '.'reactor.callLater(.1, running)
@deferred
def sleep(sec):"A blocking function magically converted in a non-blocking one."print 'start sleep %s'%sectime.sleep(sec)print '\nend sleep %s'%secreturn "ok"
def test(n,m):print "fun test()  is  start"m=mvals = []keys = []for i in xrange(m):vals.append(i)keys.append('a%s'%i)d = Nonefor i in xrange(n):d = dict(zip(keys, vals))print "fun test() is end"return d
if __name__== "__main__":
#onesleep(10).addBoth(todoprint_)reactor.callLater(.1, running)reactor.callLater(3, reactor.stop)print "go go !!!"reactor.run()
#twoaa=time.time()de = defer.Deferred()de.addCallback(test)reactor.callInThread(de.callback,10000000,100 )print time.time()-aaprint "我这里先做别的事情"print deprint "go go end"

原文: http://rfyiamcool.blog.51cto.com/1030776/1386786

Twisted的回调是个麻烦事,我觉得node.js的异步回调也麻烦,去年的时候看了将近半个月的node,刚开始学的挺high,后期学到express的各种高性能回调,有点发蒙,最后因为别的事情也就暂时放弃了。 我相信不仅是我,而且大家应该还是喜欢golang和eventlet风格,用同步的形式写代码解决异步的事。

twisted应用中异步回调的方式及线程的应用相关推荐

  1. 使用Future实现异步回调的方式

    在JDK5中增加了Future异步获取结果的功能,但是这种方式在获取的时候是阻塞的,在正常场景下这种实现方式肯定是不太友好的,当然可以通过轮询的方式去获取异步结果,但是这种方式比较消耗CPU并且获取结 ...

  2. ADO.NET中异步处理的方式

    以用3种不同的方式处理异步命令.一种方式是启动异步进程,再选择 IAsyncResult对象,看看进程何时完成.第二种方式是在开始异步进程时提供一个回调方法.这种方式可以并行执行其他任务.异步进程完成 ...

  3. 第三十一章 线程------GIL、线/近程池、异/同步、异步回调

    一.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple ...

  4. .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调、APM、EAP、TPL、aysnc、await

    windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线 ...

  5. c# 异步回调post请求http

    之前提到想用HttpClient发送post请求向服务器请求数据,今天被师父发现使用了c#提供的异步接口,但是使用方式却依然是同步的,就是取了Result,结果依然会阻塞主线程,所以查了查,改成异步回 ...

  6. dva中dispatch函数实现异步回调函数的方式

    #关于 dva中dispatch函数实现异步回调函数的方式 1.通过promise函数实现 这里先给出index.js 和modal模块的实现 services模块不需要做处理 //index.jsi ...

  7. python异步框架twisted_详解Python的Twisted框架中reactor事件管理器的用法

    铺垫在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: 监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件 因此我们将这样的异步模式称为Reac ...

  8. 转:在 .NET 中实现异步回调访问数据库

    在 .NET 中实现异步回调访问数据库 时间:2009-11-17 19:52来源:网络收集 作者:佚名 点击: 334 次 技术论坛 某些场合下,在对数据库进行访问时,为了避免同步访问数据时所带来的 ...

  9. c++ 异步回调_知道Java中的回调机制吗?

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

最新文章

  1. vue的数组如何存储数据
  2. [我的1024开源程序]100元写的软件工程和VB试题
  3. 最长有效括号—leetcode32
  4. 调用postman拿CSRF token的隐藏Cookie处理
  5. Windows隐藏账户处置
  6. VS2017 15.8第二个预览版本提升了对CPU Profiling和F#的支持
  7. 服务器被bash服务占满_用bash脚本自动下载ftp服务器文件
  8. UIControl UIImage
  9. 在python中创建列表的最佳和/或最快方法
  10. 十行代码实现高仿Promise
  11. 数据中心机房建设方案
  12. 联想E43升级bios激活windows 7
  13. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)
  14. “攻城狮” 需要了解的密码知识
  15. mysql 计算信度_因子数超过15个的组合信度和AVE计算工具
  16. Win10下kafka简单安装及使用
  17. ThinkPad T440s 改 T450s
  18. Summed-area table
  19. 一个大学生从月薪3500到700万和他的情感经历
  20. windows虚拟机安装Mac OS系统(操作图解)

热门文章

  1. input python_Python input 使用
  2. 神策合肥研发中心携手安徽开发者社区,深入交流共促行业发展
  3. js进阶 9-14 js如何实现下拉列表多选移除
  4. nodemailer实现node发送邮件
  5. sencha touch 模仿tabpanel导航栏TabBar(2013-11-7)
  6. 挂隐藏链接的4种代码
  7. formal method
  8. a challengefor the 2 hour course
  9. 一个硬核分布式数据库公司:pingcap
  10. 徐教授的对于商业模式创新的讲座!十分有用!