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

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

时间:2023-06-10 16:34:02浏览次数:36  
标签:12 函数 Python 代码 队列 add 文件夹 线程 bug


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

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

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

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

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

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

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

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

公众号“Python小屋”

标签:12,函数,Python,代码,队列,add,文件夹,线程,bug
From: https://blog.51cto.com/u_9653244/6454792

相关文章

  • Python文件操作的几个要点与示例
    一般操作文件时,要么是读取其中的内容,要么是往里面写入新内容,但偶尔也会需要同时进行读写。Python内置函数在操作文本文件和自定义二进制文件时比较方便,该函数语法为:open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)其中......
  • Python使用标准库itertools中count类求解数苹果问题
    问题描述:有一箱苹果,4个4个地数最后余下1个,5个5个地数最后余下2个,9个9个地数最后余下7个。编写程序计算这箱苹果至少有多少个。解题思路:先确定除以9余7的最小整数,对这个数字重复加9,如果得到的数字除以5余2就停止;然后对得到的数字重复加45,如果得到的数字......
  • Python数据分析库pandas高级接口dt和str的使用
    Series对象和DataFrame的列数据提供了cat、dt、str三种属性接口(accessors),分别对应分类数据、日期时间数据和字符串数据,通过这几个接口可以快速实现特定的功能,非常快捷。本文重点介绍和演示dt和str的用法。DataFrame数据中的日期时间列支持dt接口,该接口提供了dayofweek、dayofyear、......
  • Python多进程使用队列共享数据协同判断素数
    感谢江西师范大学李雪斌老师提供素材和第一版本代码。问题描述:创建两个队列,qIn用来存储指定范围内的整数,qOut用来存放该范围内的所有素数。创建多个进程,每个进程依次从qIn队列中获取整数,并判断是否为素数,如果是素数则存入qOut。技术要点:1)使用Python标准库multiprocessing创建和管理......
  • Python测试序列是否所有相邻元素之间都具有升序关系
    代码功能:测试给定序列中是否所有相邻元素都具有严格的升序关系,也就是每个元素都比相邻的后面元素小。......
  • Python连接两个字符串并去除首尾重复子串
    代码功能:查找两个字符串的首尾重复部分最大长度,连接两个字符串,并去除两个字符串的首尾重复部分。例如,1234和2347这两个字符串,前面字符串的234子串和后面字符串的234字串重复,两个字符串连接成为12347。参考代码与运行结果:......
  • 1000道Python题库系列分享21(11道编程题:内置函数专项练习)
    本期题目,答案在文末:参考代码:......
  • Python编程常见问题与解答
    1.问:Python代码运行速度和C语言相比,哪个更快?答:一般来说,Python代码的运行速度比C语言的慢很多,但是如果充分运用内置函数、标准库对象和函数式编程模式的话,运行速度会提高很多,可以接近C语言。2.问:学习Python编程,用哪个开发环境更好一些呢?答:目前来看,Anaconda3和PyCharm用的相对来说多......
  • Python 3.8与普通程序员有关的几个新特性
    ==============1、字典支持内置函数reversed()了。在Python3.7之前的版本中,是不支持内置函数reversed()的,但在Python3.8中,可以这样做了,2、加强了函数调用时关键参数形式的限制。在Python3.7之前的版本中,是允许这样用的,虽然很少有人这样做但在Python3.8中,不再允许了,3、改进了函......
  • python网络爬虫--爬取各省GDP
    一、选题背景1.随着经济全球化的日益深入发展,各国的经济发展也日益重要。在中国,省份是经济发展的基本单位,各省之间经济发展水平的差异较大。了解各省份GDP的数据情况,对于政府部门制定地区经济政策、企业拓展市场等具有重要的参考意义。2.因此,通过Python爬取各省份GPD数据,可......