首页 > 编程语言 > 详细

Python多线练习之问答机器人

时间:2018-12-14 12:30:39      阅读:181      评论:0      收藏:0      [点我收藏+]
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......")

Python多线练习之问答机器人

原文:http://blog.51cto.com/11478096/2330341

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!