递归下降分析程序的设计与实现_重要更新|Python程序设计开发宝典例127代码有bug...

下图是《Python程序设计开发宝典》第330页例12-7的代码,本意是使用多线程技术进行文件复制,重点演示嵌套函数定义、多线程编程技术以及队列在多线程同步时的用法。

在代码中,使用内嵌函数add()创建一个线程负责往队列q中添加要复制的文件和文件夹名称,使用内嵌函数copy()创建多个线程负责从队列q中获取这些名字并进行真正的复制或创建,使用队列q实现这些线程之间的通信和同步。

在这个例子中,add()函数对应的一个线程相当于生产者,copy()对应的多个线程相当于消费者,队列q相当于缓冲池用于平衡生产者和消费者之间的速度。

在add()函数中,原意是递归把指定路径src及其所有子文件夹中的文件名和子文件夹名都依次放入队列q,最后再往队列q中写入num(copy线程的数量)个空值None,这些空值的唯一作用是用于copy线程识别并结束工作状态。

db91931456abc0967cdbb962772e16dd.png

在上面的代码中,add()函数在往q中逐个追加要复制的文件名和文件夹名时使用了递归,这本身并没有什么问题,问题在于最后往q中写入空值None的代码也在add()函数之内。由于add函数是递归调用的,导致这段写入None的代码被执行多次,而队列q的大小有限,队列满了之后导致了线程阻塞。执行该程序时,如果参数src中没有子文件夹则运行正常,如果参数src中有子文件夹则程序无法正常结束。

解决这个问题的方法有多种,这里给出比较简单的一种。在《Python程序设计开发宝典》283页“第10章 文件与文件夹操作”讲解遍历目录树时,给出了按深度优先遍历和按广度优先遍历两种方法。参考按广度优先遍历目录树的思路,把例330页12-7代码中add()函数改写为下面的样子,就可以解决这个bug了。

24ff8929798e76ca1a5afe660d42b09f.png

《Python程序设计开发宝典》详情链接(京东自营):

3631ff311769f2d987ab5f0528fda102.png

温馨提示

关注本公众号“Python小屋”,通过菜单“最新资源”==>“历史文章”可以快速查看分专题的800篇技术文章列表(可根据关键字在页面上搜索感兴趣的文章),通过“最新资源”==>“微课专区”可以免费观看300节Python微课,通过“最新资源”==>“培训动态”可以查看近期Python培训安排,通过“最新资源”==>“教学资源”可以查看Python教学资源。

26d20e1c7d5cbc6930a65315f8cbe3e5.png

--------董付国老师Python系列图书--------

1)《Python程序设计(第2版)》清华大学出版社

5bef232fe98acb0bc9e670ca26bfa597.png

2)《Python可以这样学》清华大学出版社

2a84f0a075e09789255ce470c3e95d9a.png

3)《Python程序设计基础(第2版)》清华大学出版社

c2d3abc391eef4706ff186474d13ba42.png

4)《中学生可以这样学Python》清华大学出版社,配套微课:《中学生可以这样学Python》84节微课免费观看地址

c5db2a518b66f944331d658663b19350.png

5)《Python程序设计开发宝典》清华大学出版社

24f28a7961b15915b800a1055c3b8852.png

6)《玩转Python轻松过二级》清华大学出版社

c829b2f6763ac716908f3ef814b58a40.png

7)《Python程序设计基础与应用》机械工业出版社

ca664c83375e8fa74557b83e1a8ec6dd.png

8)《Python程序设计实验指导书》清华大学出版社

c504b1839cf9947912a090d41e05d042.png

9)《Python编程基础与案例集锦(中学版)》电子工业出版社

1c3a57f7f89fa877b20a7cf68a93d76f.png

《中学生可以这样学Python》84节微课免费观看地址

非计算机专业《Python程序设计基础》教学参考大纲

计算机相关专业“Python程序设计”教学大纲(参考)

《Python程序设计》实验指导书(30个实验)

《Python程序设计基础与应用》课后习题答案

Python课程期末考试编程题自动批卷原理与实现模板

“Python小屋”免费资源汇总(截至2018年11月28日)

Python课堂上我与学生斗智斗勇已8个学期

系列教学PPT:

1900页Python系列PPT分享一:基础知识(106页)

1900页Python系列PPT分享二:Python序列(列表、元组、字典、集合)(154页)

1900页Python系列PPT分享三:选择与循环结构语法及案例(96页)

1900页Python系列PPT分享四:字符串与正则表达式(109页)

1900页Python系列PPT分享五:函数设计与应用(134页)

1900页Python系列PPT分享六:面向对象程序设计(86页)

1900页Python系列PPT分享七:文件操作(132页)

1900页Python系列PPT分享八:异常处理结构与程序调试、测试(70页)

报告PPT(163页):基于Python语言的课程群建设探讨与实践

报告PPT(123页):Python编程基础精要

2000页Python系列PPT分享九:(GUI编程)(122页)

Python实验项目1例:使用进程池统计指定范围内素数的个数

(PPT)Python程序设计课程教学内容组织与教学方法实践

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值