Python多線練習之問答機器人
阿新 • • 發佈:2018-12-14
import threading
import queue # python中的佇列類,預設是FIFO,而且是執行緒安全的 自帶鎖
1.定義好的問題和答案的詞彙表,key為問題,value為答案
qa = {'你好' : '你好', '我愛你' : '我也愛你','豬豬':'豬是一種動物','豬豬俠':'豬豬俠是一部動畫片'}
questionqueue = queue.Queue(1) # 問題佇列,
queue.LifoQueue() # 也支援後進先出
condition = threading.Condition()
2.定義答題機器人執行緒
class robotthread(threading.Thread):
def init
threading.Thread.init(self)
pass
pass
def run(self): while True: condition.acquire() # 加鎖 if questionqueue.full(): # 佇列是否滿了 qs = questionqueue.get() # 出佇列 # print(qs) word = list(tuple(qs)) # 拆詞,小技巧。 元組接受字串,會自動打散 # print(tuple(qs)) keylist = list(qa.keys()) # 獲取所有的key times = 0 # 記錄頻次 maxkey = '' # 儲存出現頻次最大的key # 得到頻次最大的key,這裡只是取出現次數最多的語句 for tempkey in keylist: temp = 0 for w in word: temp += tempkey.count(w) # str自帶的count計數 pass if temp > times: times = temp maxkey = tempkey pass pass if times > 0: # 如果找到了對應的key,times就會大於0,key也存在 print(qa[maxkey]) # 答應機器人的回答 else: print("不好意思,你說的太難了,我理解不了!") if questionqueue.empty(): condition.notify() # 通知已回答問題,可以再問了 condition.wait() # 本執行緒同時進入阻塞狀態 pass pass condition.release() # 解鎖 pass
3.定義提問機器人執行緒
class askthread(threading.Thread):
def init(self):
threading.Thread.init(self)
pass
def run(self): while True: condition.acquire() # 加鎖 ask = input("你說吧,我在呢:") # 自帶阻塞執行緒,等待使用者輸入 questionqueue.put(ask) # 入佇列 condition.notify() # 通知其他執行緒可以答題了 condition.wait() condition.release() pass
if name == 'main':
啟動提問執行緒
athread = askthread()
athread.start()
# 啟動答題執行緒
rthread = robotthread()
rthread.start()
athread.join() # 阻塞呼叫執行緒,一般是指主執行緒(存在子執行緒下再起子執行緒的可能) 估計以後都不會用
rthread.join()
print("主執行緒running......")