Python多线练习之问答机器人
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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......")
以上是关于Python多线练习之问答机器人的主要内容,如果未能解决你的问题,请参考以下文章