1. 程式人生 > >Python多線練習之問答機器人

Python多線練習之問答機器人

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

(self):
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......")