微信公众号: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.