第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Twisted TCP Server無(wú)法回送數(shù)據(jù)

Twisted TCP Server無(wú)法回送數(shù)據(jù)

德瑪西亞99 2019-04-19 16:29:33
求熟悉Twisted底層的大神幫助。我的TCP端口服務(wù)器一直服務(wù)正常,可是一旦加入Redis之后,卻不再返回?cái)?shù)據(jù)了?classPlainTCP(protocol.Protocol):def__init__(self,factory):passdefconnectionMade(self):self.factory.numConnections+=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)self.transport.write("Helloremote\r\n")defconnectionLost(self,reason):self.factory.numConnections-=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)defdataReceived(self,data):(self.snrCode,rDat,pDat)=getDataParsed(data)self.transport.write(data)以上代碼在遠(yuǎn)程客戶(hù)端可以立即獲得復(fù)制的數(shù)據(jù)而增加了SQL/Redis數(shù)據(jù)保存后,事情變得奇怪了。#!/usr/bin/envpythonimporttimeimportbinasciiimporttxredisapifromtwisted.internetimportdeferfromtwisted.internetimportprotocol,reactorfromtwisted.internet.protocolimportFactoryfromtwisted.enterpriseimportadbapifromtwisted.pythonimportlogfromdmpackimportDmpackfromdmdbimportDmdbfromdmconfigimportDmConfdm=Dmpack()conf=DmConf().loadConf()rcs=txredisapi.lazyConnection(password=conf['RedisPassword'])dbpool=adbapi.ConnectionPool("MySQLdb",db=conf['DbName'],user=conf['DbAccount'],\passwd=conf['DbPassword'],host=conf['DbHost'],\use_unicode=True,charset=conf['DbCharset'])defgetDataParsed(data):realtime=Noneperiod=NonesnrCode=dm.snrToAscii(data[2:7])realtime=data[7:167]perid=data[167:-2]return(snrCode,realtime,period)classPlainTCP(protocol.Protocol):def__init__(self,factory):self.factory=factoryself.factory.numConnections=0self.snrCode=Noneself.rData=Noneself.pData=Noneself.err=NonedefconnectionMade(self):self.factory.numConnections+=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)self.transport.write("Helloremote\r\n")##這里也不返回?cái)?shù)據(jù)了defconnectionLost(self,reason):self.factory.numConnections-=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)@defer.inlineCallbacksdefdataReceived(self,data):globaldbpool,rcs(self.snrCode,rDat,pDat)=getDataParsed(data)ifself.snrCode==NoneorrDat==NoneorpDat==None:err="Badformat"else:err="OK"print"err:%s"%(err)###這里可以在終端打印數(shù)據(jù)self.err=errself.transport.write(self.snrCode)###沒(méi)有數(shù)據(jù)返回self.transport.write(self.err)self.transport.write(rDat)self.transport.write(pDat)self.transport.loseConnection()ifself.snrCode!=NoneandrDat!=NoneandpDat!=None:res=yieldself.saveRealTimeData(rcs,rDat)res=yieldself.savePeriodData(dbpool,pDat,conf)print"err2:%s"%(err)###終端有打印@defer.inlineCallbacksdefsaveRealTimeData(self,rc,dat):yieldrc.set(key,val)###自己腦補(bǔ)Key、Valyieldrc.expire(key,30)###可以保存,已經(jīng)確認(rèn)@defer.inlineCallbacksdefsavePeriodData(self,rc,dat,conf):query="insert....."###自己腦補(bǔ)SQLyieldrc.runQuery(query)###可以保存,已經(jīng)確認(rèn)classPlainTCPFactory(protocol.Factory):defbuildProtocol(self,addr):returnPlainTCP(self)defmain():dmdb=Dmdb()ifnotdmdb.detectDb():print"PleaserunMySQLRDBSfirst."sys.exit()log.startLogging(sys.stdout)reactor.listenTCP(8080,PlainTCPFactory())reactor.run()if__name__=="__main__":main()現(xiàn)象是一旦加入了異步庫(kù)之后,socket就不在回傳了。原始Demo中self.transport.write()沒(méi)有任何修飾符,所以這應(yīng)該是同步的。搞不懂異步數(shù)據(jù)庫(kù)加入后,為何連connectionMade()這個(gè)不相關(guān)的句柄中的write()也被失效了。而同時(shí)print卻是有效的?
查看完整描述

2 回答

?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊

謝謝大哥關(guān)注這個(gè)問(wèn)題。這個(gè)是2015年的問(wèn)題,所以我花了一番力氣才看懂我自己的問(wèn)題,慢慢回想起來(lái)。
因?yàn)楫?dāng)時(shí)我根本沒(méi)有找到答案,所以只有一步步地反復(fù)調(diào)整。最后結(jié)論是調(diào)用異步方式本身不需要yield。因?yàn)橐坏┱{(diào)用者yield,就調(diào)用者也成了生成器了。所以?xún)?nèi)嵌print也就不執(zhí)行了。
@defer.inlineCallbacks#這里不需要@defer.inlineCallbacks
defdataReceived(self,data):
res=yieldself.saveRealTimeData(rcs,rDat)#這里不需要yield
@defer.inlineCallbacks
defsaveRealTimeData(self,rc,dat,conf):
yieldrc.set(key,val)#這里需要保留yield
yieldrc.expire(key,conf['RedisDataTTL'])
宗旨:
@defer.inlineCallback修飾的函數(shù)里必然有yield;異步函數(shù)方法調(diào)用者不要再使用異步。
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-19
  • 2 回答
  • 0 關(guān)注
  • 579 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)