社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

重要更新|《Python程序设计开发宝典》例12-7代码有bug

Python小屋 • 5 年前 • 378 次点击  

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

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

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

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


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

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


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



温馨提示

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


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

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


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


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

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


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


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


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


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


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


《中学生可以这样学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程序设计课程教学内容组织与教学方法实践


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31629
 
378 次点击