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