日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 twisted应用中异步回调的方式及线程的应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

? ? 學(xué)習(xí)了golang的goruntine后,再回過頭來看twisted網(wǎng)絡(luò)編程庫中的異步應(yīng)用,沒事琢磨下,以前搞過一個twisted做負(fù)載分發(fā),性能差的要命,這幾天再搞搞,看看能不能做少許提升。


說正題:

先介紹下twisted的幾個的概念

twisted有個defer的概念,說來golang也有個defer,只是golang的是和panic recover配合做異常捕獲的。 twisted的defer是異步的一種變現(xiàn)方式,可以這么理解,他和thread的區(qū)別是,他是基于時間event的。

有了deferred,即可對任務(wù)的執(zhí)行進(jìn)行管理控制。防止程序的運(yùn)行,由于等待某項(xiàng)任務(wù)的完成而陷入阻塞停滯,提高整體運(yùn)行的效率。


Deferred能幫助你編寫異步代碼,但并不是為自動生成異步或無阻塞的代碼!要想將一個同步函數(shù)編程異步函數(shù),必須在函數(shù)中返回Deferred并正確注冊回調(diào)。


事件的好處,有堵塞io的操作的時候,我把這個任務(wù)扔到后面執(zhí)行,當(dāng)io執(zhí)行好了后,我再繼續(xù)計算剛才那個事 .



callback鏈表有三個形式,正常結(jié)束,例外結(jié)束,任意狀態(tài),他們分別調(diào)用會調(diào)用 addCallback\addErrback\addBoth注冊到鏈表中。 特意說下,addBoth是任何的狀態(tài)也都會執(zhí)行


這里再說下,twsited的線程。reactor.callFromThread 是由reactor.run 搞出來的,所以你做好狀態(tài)用reactor.stop可以控制他的關(guān)閉,就是因?yàn)樗怯蓃eactor.run派出來的進(jìn)程,所以會堵塞主任務(wù)線程的,然而reactor.callInThread是一個個的獨(dú)立的線程,他不堵塞了,但是他也無法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自帶了一個順序執(zhí)行的組件叫做 callLater, 我們可以規(guī)定第一秒執(zhí)行這個函數(shù),第二秒執(zhí)行那個函數(shù),第三秒的時候關(guān)閉realor ! 干脆點(diǎn),你可以想成是計劃任務(wù)。

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理解其實(shí)卻是有點(diǎn)麻煩,大家只要知道他是基于事件的后,慢慢理解就行了。


#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的回調(diào)是個麻煩事,我覺得node.js的異步回調(diào)也麻煩,去年的時候看了將近半個月的node,剛開始學(xué)的挺high,后期學(xué)到express的各種高性能回調(diào),有點(diǎn)發(fā)蒙,最后因?yàn)閯e的事情也就暫時放棄了。 我相信不僅是我,而且大家應(yīng)該還是喜歡golang和eventlet風(fēng)格,用同步的形式寫代碼解決異步的事。

總結(jié)

以上是生活随笔為你收集整理的twisted应用中异步回调的方式及线程的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。