下圖是《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課本第二版答案、關注本公眾號“Python小屋”,通過菜單“最新資源”==>“歷史文章”可以快速查看分專題的800篇技術文章列表(可根據關鍵字在頁面上搜索感興趣的文章),通過“最新資源”==>“微課專區”可以免費觀看300節Python微課,通過“最新資源”==>“培訓動態”可以查看近期Python培訓安排,通過“最新資源”==>“教學資源”可以查看Python教學資源。
--------董付國老師Python系列圖書--------
1)《Python程序設計(第2版)》清華大學出版社
2)《Python可以這樣學》清華大學出版社
3)《Python程序設計基礎(第2版)》清華大學出版社
python代碼生成器,4)《中學生可以這樣學Python》清華大學出版社,配套微課:《中學生可以這樣學Python》84節微課免費觀看地址
5)《Python程序設計開發寶典》清華大學出版社
6)《玩轉Python輕松過二級》清華大學出版社
7)《Python程序設計基礎與應用》機械工業出版社
8)《Python程序設計實驗指導書》清華大學出版社
python程序設計答案?9)《Python編程基礎與案例集錦(中學版)》電子工業出版社
《中學生可以這樣學Python》84節微課免費觀看地址
非計算機專業《Python程序設計基礎》教學參考大綱
計算機相關專業“Python程序設計”教學大綱(參考)
《Python程序設計》實驗指導書(30個實驗)
c語言第一個程序helloworld?《Python程序設計基礎與應用》課后習題答案
Python課程期末考試編程題自動批卷原理與實現模板
“Python小屋”免費資源匯總(截至2018年11月28日)
Python課堂上我與學生斗智斗勇已8個學期
系列教學PPT:
python解題軟件、1900頁Python系列PPT分享一:基礎知識(106頁)
1900頁Python系列PPT分享二:Python序列(列表、元組、字典、集合)(154頁)
1900頁Python系列PPT分享三:選擇與循環結構語法及案例(96頁)
1900頁Python系列PPT分享四:字符串與正則表達式(109頁)
1900頁Python系列PPT分享五:函數設計與應用(134頁)
python手機版,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程序設計課程教學內容組織與教學方法實踐
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态