題目如下: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求大神指點,謝謝!
Python的一道題以及我的代碼,求大神看看有什么可以改進(jìn)的地方
一只斗牛犬
2019-04-06 16:57:29