twisted应用中异步回调的方式及线程的应用

简介:

前言:

    学习了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了。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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, '---------------' ,j
         time.sleep( 2 )
def gg(i,j):
     time.sleep( 2 )
     if  i == 10 :
         reactor.stop()
     print i, '---------------' ,j
     time.sleep( 2 )
for  in  range( 50 ):
#    reactor.callFromThread(gg,i,i)
     reactor.callInThread(tt,i,i)
print  "I want to start"
reactor.run()


wKioL1M3Fm6Qz0MpAAHRfgWhyGY901.jpg

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.'

wKioL1M3HlySYu4YAAETL67er8M865.jpg


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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#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' %sec
     time.sleep(sec)
     print  '\nend sleep %s' %sec
     return  "ok"
def test(n,m):
     print  "fun test()  is  start"
     m=m
     vals = []
     keys = []
     for  in  xrange(m):
         vals.append(i)
         keys.append( 'a%s' %i)
     d = None
     for  in  xrange(n):
         d = dict(zip(keys, vals))
     print  "fun test() is end"
     return  d
if  __name__==  "__main__" :
#one
     sleep( 10 ).addBoth(todoprint_)
     reactor.callLater(. 1 , running)
     reactor.callLater( 3 , reactor.stop)
     print  "go go !!!"
     reactor.run()
#two
     aa=time.time()
     de = defer.Deferred()
     de.addCallback(test)
     reactor.callInThread(de.callback, 10000000 , 100  )
     print time.time()-aa
     print  "我这里先做别的事情"
     print de
     print  "go go end"


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


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






 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1386786,如需转载请自行联系原作者


相关文章
|
1月前
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
65 6
|
2月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
123 17
|
3月前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
72 2
|
4月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
473 6
|
4月前
|
存储 监控 安全
深入理解ThreadLocal:线程局部变量的机制与应用
在Java的多线程编程中,`ThreadLocal`变量提供了一种线程安全的解决方案,允许每个线程拥有自己的变量副本,从而避免了线程间的数据竞争。本文将深入探讨`ThreadLocal`的工作原理、使用方法以及在实际开发中的应用场景。
135 2
|
4月前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
4月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
47 17
|
1月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
58 26
|
3月前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程

热门文章

最新文章