欢迎第 位访客

练习题,使用多线程编写一个简单的文本处理工具

一. 练习题要求:
  编写一个简单的文本处理工具,具备三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件

二. 分析:
  三个任务,那就是三个线程.分别的输入,转换,写入,这3个线程.那么写入的输入,其他线程怎么取出?我们可以使用Queue队列,把用户输入的字符写入到队列中,然后再进行转换.转换完成后,再写入到另外一个队列中.等待最后写入文件
三.实现
  
 1 from threading import Thread
 2 from multiprocessing import Queue
 3 
 4 
 5 def inp(q):
 6     while True:
 7         inp_str = input(">>>>").strip()
 8         q.put(inp_str)
 9         if inp_str == "exit":
10             break
11 
12 
13 def str_up(q, q1):
14     while True:
15         msg = q.get().upper()
16         q1.put(msg)
17         if msg == "EXIT":
18             break
19 
20 
21 def dump_f(q1):
22     while True:
23         if q1.get() != "EXIT":
24             with open("test.txt", "a+", encoding="utf-8") as f:
25                 f.write(q1.get() + "\n")
26         else:
27             break
28 
29 
30 if __name__ == '__main__':
31     q = Queue()
32     q1 = Queue()
33     t1 = Thread(target=inp, args=(q,))
34     t2 = Thread(target=str_up, args=(q, q1))
35     t3 = Thread(target=dump_f, args=(q1,))
36     t1.start()
37     t2.start()
38     t3.start()
简单的文本处理
 1 from threading import Thread
 2 from multiprocessing import Queue
 3 
 4 
 5 def inp(q):
 6     while True:
 7         inp_str = input(">>>>").strip()
 8         q.put(inp_str)
 9         if inp_str == "exit":
10             break
11 
12 
13 def str_up(q, ):
14     while True:
15         msg = q.get().upper()
16         q.put(msg)
17         if msg == "EXIT":
18             break
19 
20 
21 def dump_f(q):
22     while True:
23         new_msg = q.get()
24         if new_msg == "EXIT":
25             break
26         with open("test.txt", "a+", encoding="utf-8") as f:
27             f.write(new_msg + "\n")
28 
29 
30 if __name__ == '__main__':
31     q = Queue()
32     t1 = Thread(target=inp, args=(q,))
33     t2 = Thread(target=str_up, args=(q,))
34     t3 = Thread(target=dump_f, args=(q,))
35     t1.start()
36     t2.start()
37     t3.start()
优化版本

  刚编写完成,关了电脑.突然想到,队列写入一个,再拿走一个,此时队列就是空的.为啥还要多用q1那个队列呢?把转换后的数据直接写入到q队列里,再次拿出写到文件的时候,不就是转换后的数据了吗?于是,再打开电脑,试了一下.最后那个exit的判断,是没有写到文件里.如果想写入到文件,把那个判断写到with open的后面即可.

posted @ 2018-07-07 22:40  大橡皮  阅读(376)  评论(0编辑  收藏  举报