微信公众号:stackflow
如有问题或建议,请公众号留言
Question:https://stackoverflow.com/questions/419163/
最近更新:2018-12-29
需求分析
如题:
代码如下:
1# Threading example
2import time
3import thread
4
5def myfunction(string, sleeptime, lock, *args):
6 while True:
7 lock.acquire()
8 time.sleep(sleeptime)
9 lock.release()
10 time.sleep(sleeptime)
11
12if __name__ == "__main__":
13 lock = thread.allocate_lock()
14 thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
15 thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
Answers
当python解释器运行源代码时, 它将执行所有能找到的代码。
在代码执行前,解释器会定义几个特定的变量。例如,如果解释器将该模块 (源文件) 作为主程序运行, 会设置__name__ == '__main__'。如果此文件是从另一个模块导入的, 则__name__将设置为模块的名称。
示例中的代码,假设是作为主函数来运行,即
1python threading_example.py
设置特殊变量后, 它将执行导入语句并加载这些模块。然后, 它将计算def块, 创建一个函数对象, 并创建一个名为 myfunction 的变量, 指向该函数对象。然后, 它将读取 if 语句, 并看到 __name__ 确实等于 "__main__", 因此它将执行显示在其中的代码块。
这样做的一个原因是, 有时编写一个模块 (a.py), 可以直接执行。或者, 也可以在另一个模块中导入和使用它。通过执行主程序检查, 你希望只将模块作为程序运行时执行该代码, 而不是在有人只想要导入你的模块并调用函数时执行该代码。
More 有更多解释
注: 如果将代码放在函数定义之前, 它将在 __name__之前执行。
1print("This code executes before main.")
2
3def functionA():
4 print("Function A")
5
6def functionB():
7 print("Function B")
8
9if __name__ == '__main__':
10 functionA()
11 functionB()
作为主函数执行的输出如下:
1This code executes before main.
2Function A
3Function B
如果导入此模块而不是用作主函数, 则在导入时将输出以下内容:
1This code executes before main.