最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入分析在Python模塊頂層運行的代碼引起的一個Bug

 更新時間:2014年07月04日 09:52:16   作者:Desmond Chen  
幾個星期前, 我的同事跑過來, 說發(fā)現(xiàn)一個奇怪的Bug: 在使用Python的subprocess運行子進程時, 當(dāng)子進程運行失敗時居然沒有拋出錯誤!

然后我們在Interactive Python prompt中測試了一下:

>>> import subprocess
  >>> subprocess.check_call("false")
  0

而在其他機器運行相同的代碼時, 卻正確的拋出了錯誤:

>>> subprocess.check_call("false")
  Traceback (most recent call last):
   File "", line 1, in 
   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 542, in check_call
    raise CalledProcessError(retcode, cmd)
  subprocess.CalledProcessError: Command 'false' returned non-zero exit status 1

看來是subprecess誤以為子進程成功的退出了導(dǎo)致的原因.

深入分析

第一眼看上去, 這一問題應(yīng)該是Python自身或操作系統(tǒng)引起的. 這到底是怎么發(fā)生的? 于是我的同事查看了subprocess的wait()方法:

def wait(self):
  """Wait for child process to terminate. Returns returncode attribute."""
  while self.returncode is None:
   try:
    pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
   except OSError as e:
    if e.errno != errno.ECHILD:
     raise
    # This happens if SIGCLD is set to be ignored or waiting
    # for child processes has otherwise been disabled for our
    # process. This child is dead, we can't get the status.
    pid = self.pid
    sts = 0
   # Check the pid and loop as waitpid has been known to return
   # 0 even without WNOHANG in odd situations. issue14396.
   if pid == self.pid:
    self._handle_exitstatus(sts)
  return self.returncode

可見, 如果os.waitpid的ECHILD檢測失敗, 那么錯誤就不會被拋出. 通常, 當(dāng)一個進程結(jié)束后, 系統(tǒng)會繼續(xù)記錄其信息, 直到母進程調(diào)用wait()方法. 在此期間, 這一進程就叫"zombie". 如果子進程不存在, 那么我們就無法得知其是否成功還是失敗了.

以上代碼還能解決另外一個問題: Python默認認為子進程成功退出. 大多數(shù)情況下, 這一假設(shè)是沒問題的. 但當(dāng)一個進程明確表明忽略子進程的SIGCHLD時, waitpid()將永遠是成功的.

回到原來的代碼中

我們是不是在我們的程序中明確設(shè)置忽略SIGCHLD? 不太可能, 因為我們使用了大量的子進程, 但只有極少數(shù)情況下才出現(xiàn)同樣的問題. 再使用git grep后, 我們發(fā)現(xiàn)只有在一段獨立代碼中, 我們忽略了SIGCHLD. 但這一代嗎根本就不是程序的一部分, 只是引用了一下.

一星期后

一星期后, 這一錯誤又再一次發(fā)生. 并且通過簡單的調(diào)試, 在debugger中重現(xiàn)了該錯誤.

經(jīng)過一些測試, 我們確定了正是由于程序忽略了SIGCHLD才引起的這一bug. 但這是怎么發(fā)生的呢?

我們查看了那段獨立代碼, 其中有一段:

signal.signal(signal.SIGCHLD, signal.SIG_IGN)
我們是不是無意間import了這段代碼到程序中? 結(jié)果顯示我們的猜測是正確的. 當(dāng)import了這段代碼后, 由于以上語句是在這一module的頂層, 而不是在一個function中, 導(dǎo)致了它的運行, 忽略了SIGCHLD, 從而導(dǎo)致了子進程錯誤沒有被拋出!

總結(jié)

這一bug的發(fā)生, 給了我們兩個教訓(xùn). 第一是, 在debug檢查時, 應(yīng)該從新的代碼到老的代碼, 再到Python Library. 因為新代碼發(fā)生錯誤的幾率大于老代碼, 而python library中發(fā)生錯誤的幾率更小.

第二是, 不要將可能會引起副作用的代碼寫在module頂層, 而應(yīng)當(dāng)寫到functuon中. 因為如果該module被import, 那么在頂層的代碼就會運行, 導(dǎo)致各種不可知的事件發(fā)生.

相關(guān)文章

  • python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題

    python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題

    在Python中,除非特別需要返回或傳參元組,一般不推薦在語句末尾添加逗號,應(yīng)該注意檢查是否存在末尾逗號導(dǎo)致的這些副作用,這篇文章主要介紹了python末尾逗號導(dǎo)致返回結(jié)果是一個元組,需要的朋友可以參考下
    2023-09-09
  • plotly分割顯示mnist的方法詳解

    plotly分割顯示mnist的方法詳解

    這篇文章主要為大家詳細介紹了plotly分割顯示mnist的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 如何解決django-celery啟動后迅速關(guān)閉

    如何解決django-celery啟動后迅速關(guān)閉

    在本篇文章里小編給大家整理的是關(guān)于django-celery啟動后迅速關(guān)閉的解決方法,有需要的朋友們學(xué)習(xí)下。
    2019-10-10
  • caffe binaryproto 與 npy相互轉(zhuǎn)換的實例講解

    caffe binaryproto 與 npy相互轉(zhuǎn)換的實例講解

    今天小編就為大家分享一篇caffe binaryproto 與 npy相互轉(zhuǎn)換的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python Asyncio調(diào)度原理詳情

    Python Asyncio調(diào)度原理詳情

    這篇文章主要介紹了Python Asyncio調(diào)度原理詳情,Python.Asyncio是一個大而全的庫,它包括很多功能,而跟核心調(diào)度相關(guān)的邏輯除了三種可等待對象外,還有其它一些功能,它們分別位于runners.py,base_event.py,event.py三個文件中
    2022-06-06
  • Python Pandas的簡單使用教程

    Python Pandas的簡單使用教程

    Pandas 是python的一個數(shù)據(jù)分析包,最初由AQR Capital Management于2008年4月開發(fā),并于2009年底開源出來,目前由專注于Python數(shù)據(jù)包開發(fā)的PyData開發(fā)team繼續(xù)開發(fā)和維護,今天通過本文給大家介紹Python Pandas的簡單使用教程,感興趣的朋友一起看看吧
    2021-08-08
  • 使用Python實現(xiàn)一鍵往Word文檔的表格中填寫數(shù)據(jù)

    使用Python實現(xiàn)一鍵往Word文檔的表格中填寫數(shù)據(jù)

    在工作中,我們經(jīng)常遇到將Excel表中的部分信息填寫到Word文檔的對應(yīng)表格中,以生成報告,方便打印,所以本文小編就給大家介紹了如何使用Python實現(xiàn)一鍵往Word文檔的表格中填寫數(shù)據(jù),文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2023-12-12
  • python使用正則表達式分析網(wǎng)頁中的圖片并進行替換的方法

    python使用正則表達式分析網(wǎng)頁中的圖片并進行替換的方法

    這篇文章主要介紹了python使用正則表達式分析網(wǎng)頁中的圖片并進行替換的方法,涉及Python使用正則表達式的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 完美解決pycharm導(dǎo)入自己寫的py文件爆紅問題

    完美解決pycharm導(dǎo)入自己寫的py文件爆紅問題

    今天小編就為大家分享一篇完美解決pycharm導(dǎo)入自己寫的py文件爆紅問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python設(shè)計模式之迭代器模式原理與用法實例分析

    Python設(shè)計模式之迭代器模式原理與用法實例分析

    這篇文章主要介紹了Python設(shè)計模式之迭代器模式原理與用法,結(jié)合具體實例形式分析了迭代器模式的概念、原理、定義及使用方法,代碼注釋說明簡單易懂,需要的朋友可以參考下
    2019-01-01

最新評論

武清区| 上蔡县| 屏东市| 鄂托克前旗| 溆浦县| 武安市| 饶平县| 麟游县| 会同县| 彭州市| 奈曼旗| 普陀区| 富平县| 屏边| 德惠市| 余庆县| 板桥市| 温宿县| 榆社县| 静安区| 涿鹿县| 德清县| 山西省| 将乐县| 讷河市| 南开区| 榆林市| 襄樊市| 霞浦县| 南宫市| 中江县| 洪洞县| 微博| 北辰区| 池州市| 绵阳市| 原阳县| 平谷区| 静海县| 句容市| 松阳县|