微信公衆號:stackflow
如有問題或建議,請公衆號留言
Question:https://stackoverflow.com/questions/419163/
最近更新:2018-12-29
需求分析
如題:
代碼如下:
# Threading example
import time
import thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
Answers
當python解釋器運行源代碼時, 它將執行所有能找到的代碼。
在代碼執行前,解釋器會定義幾個特定的變量。例如,如果解釋器將該模塊 (源文件) 作爲主程序運行, 會設置__name__ == '__main__'
。如果此文件是從另一個模塊導入的, 則__name__
將設置爲模塊的名稱。
示例中的代碼,假設是作爲主函數來運行,即
python threading_example.py
設置特殊變量後, 它將執行導入語句並加載這些模塊。然後, 它將計算def
塊, 創建一個函數對象, 並創建一個名爲 myfunction
的變量, 指向該函數對象。然後, 它將讀取 if
語句, 並看到 __name__
確實等於 "__main__"
, 因此它將執行顯示在其中的代碼塊。
這樣做的一個原因是, 有時編寫一個模塊 (a.py
), 可以直接執行。或者, 也可以在另一個模塊中導入和使用它。通過執行主程序檢查, 你希望只將模塊作爲程序運行時執行該代碼, 而不是在有人只想要導入你的模塊並調用函數時執行該代碼。
More 有更多解釋
注: 如果將代碼放在函數定義之前, 它將在 __name__
之前執行。
print("This code executes before main.")
def functionA():
print("Function A")
def functionB():
print("Function B")
if __name__ == '__main__':
functionA()
functionB()
作爲主函數執行的輸出如下:
This code executes before main.
Function A
Function B
如果導入此模塊而不是用作主函數, 則在導入時將輸出以下內容:
This code executes before main.