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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python的一道題以及我的代碼,求大神看看有什么可以改進(jìn)的地方

Python的一道題以及我的代碼,求大神看看有什么可以改進(jìn)的地方

一只斗牛犬 2019-04-06 16:57:29
題目如下:spam系統(tǒng),假設(shè)我們可以獲得線上的實時請求(按時間順序)每個請求包含如下信息:時間(unix時間戳)用戶名動作(提問、回答、評論)內(nèi)容依次考慮如何解決以下問題:1.當(dāng)發(fā)現(xiàn)動作頻率較高的用戶時,輸出報警(1分鐘內(nèi)超過10次評論、回答、提問)2.當(dāng)發(fā)現(xiàn)一個用戶連續(xù)發(fā)重復(fù)的內(nèi)容時,輸出報警(連續(xù)發(fā)了10個相同的評論、回答、提問)3.使用你覺得最優(yōu)美的方法將上面的策略與程序分離開。使得上面的策略可以隨時更新而不用修改程序。要求:服務(wù)監(jiān)聽一個端口,使用測試程序模擬用戶行為不斷向服務(wù)發(fā)送請求,請求格式為json,如:{"time":1323333"user":"xxx","action":"answer","content":"abcde"}服務(wù)輸出報警格式如下xxx,"頻繁提問"一下是我的代碼:client.pyimportsocketimportjsonimporttimeimportgeventimportrandomdefgenerateContents():"""隨機(jī)生成內(nèi)容"""chars=[chr(c)forcinrange(ord('a'),ord('z')+1)]result=[''.join(random.sample(chars,5))foriinrange(3)]returnresultclassWorker():def__init__(self,name,socket):self.name=nameself.socket=socketself.actions=['question','answer','comment']self.contents=generateContents()def__call__(self):while1:data=self._generateData()data=json.dumps(data)self._request(data)def_request(self,data):s=self.socket.socket()socket=self.socket.gethostname()port=1234s.connect((socket,port))s.recv(1024)s.send(data)s.close()gevent.sleep(random.randint(1,3)*0.5)def_generateData(self):data={}data['time']=time.time()data['user']=self.namedata['action']=random.choice(self.actions)data['content']=random.choice(self.contents)returndataif__name__=='__main__':threads=[gevent.spawn(Worker(chr(i),socket))foriinrange(ord('a'),ord('f'))]gevent.joinall(threads)server.pyimportsocketimportjsonfromfunctoolsimportwrapsfromMyExamineimportMyExaminedefrun():s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=''port=1234s.bind((host,port))s.listen(10)while1:c,addr=s.accept()c.send('Thisisasimpleserver'.encode('utf-8'))rec=c.recv(1024)do_something(rec)c.close()defformat2Json(func):deff(*args):data=json.loads(args[0])func(data)returnf@format2Json@MyExaminedefdo_something(data):"""模擬后臺處理用戶發(fā)來的請求"""printdataif__name__=='__main__':run()MyExamine.pyfrombaseExamineimportBaseExaminefromcollectionsimportdequeclassMyExamine(BaseExamine):def__init__(self,func):self.rateCache={}self.timesCache={}self.func=funcdefexamineRate(self,data):userQueue=self.rateCache.setdefault(data['user'],deque())whileuserQueue:item=userQueue.pop()ifdata['time']-item['time']10:self.showWarning('User:%s頻繁操作'.decode('utf8')%data['user'])defexamineContentTimes(self,data):userActions=self.timesCache.setdefault(data['user'],{})contentTimes=self.timesCache.setdefault(data['action'],{})key=data['content']contentTimes[key]=contentTimes.get(key,0)+1ifcontentTimes[key]>10:self.showWarning('User:%s%s%s超過10次'.decode('utf8')%(data['user'],data['action'],key))defshowWarning(self,msg):print'\033[;31m'+msg+'\033[0m'def__call__(self,*args):data=args[0]self.examineRate(data)self.examineContentTimes(data)self.func(*args)baseExamine.pyclassBaseExamine():"""模板方法的基類"""def__init__(self,func):passdef__call__(self,*args):pass求大神指點,謝謝!
查看完整描述

2 回答

?
冉冉說

TA貢獻(xiàn)1877條經(jīng)驗 獲得超1個贊

這個沒有最佳解法吧,看個人理解……下面是我的理解:1.不同的策略分為不同的類,提供一個統(tǒng)一的接口,比如#strategy.py
classUserRate(object):
def__init__(self,comment_per_user_min=10):
#init
defcheck(self,userdata):
#檢查用戶數(shù)據(jù),超過限制即報警
classUserDupContent(object):
def__init__(self,content_send_per_user=10):
#init
defcheck(self,userdata):
#檢查用戶數(shù)據(jù)2.使用依賴注入將策略注入到檢查程序:classGuarder(object):
defaddStrategy(self,strategy):
#添加一個策略
defcheck(self,userdata):
#使用已經(jīng)添加的策略逐個檢查
#返回檢查結(jié)果
defreload_from(self,conf):
#解析配置并創(chuàng)建相應(yīng)對象
self.addStrategy(strategy)
@classmethod
defcreate(cls,conf=''):
obj=cls()
ifconf:
obj.reload_from(conf)3.調(diào)用Guarder實例檢查guarder=Guarder.create('antispam.ini')
defindex():
ifguarder.check(userdata):
pass
else:
#error
defadmin_reload_guarder():
'''根據(jù)web請求運行時重載配置'''
importstrategy
reload(strategy)
guarder.reload(conf)示例配置文件:#antispam.ini
[strategies]
inst=usercontent,userrate
[usercontent]
type=strategy.UserDupContent
init.comment_per_user_min=5
[userrate]
type=strategy.UserRate
init.content_send_per_user=5以上能夠完成的功能如下:
1.隔離了策略代碼,使用依賴注入的方式完成
2.策略本身是ducktyping,靈活擴(kuò)充
3.策略代碼文件strategy.py不停止服務(wù)器熱部署當(dāng)然,配置文件可以調(diào)整格式,直接用python代碼寫都可以
                            
查看完整回答
反對 回復(fù) 2019-04-06
?
千巷貓影

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

關(guān)于“最優(yōu)美的方法將上面的策略與程序分開”:引入輕量級的信號/事件機(jī)制,降低耦合度。更進(jìn)一步,使用諸如rabbitmq這樣的消息隊列,策略和程序可以分開布署。關(guān)于這個問題實現(xiàn)上的優(yōu)化:使用類似redis這樣的服務(wù),寫入自動過期的數(shù)據(jù),只要檢查相應(yīng)用戶的數(shù)據(jù)數(shù)量是不是超過閾值即可。這樣系統(tǒng)在多臺設(shè)備上負(fù)載均衡也方便。
                            
查看完整回答
反對 回復(fù) 2019-04-06
  • 2 回答
  • 0 關(guān)注
  • 420 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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