Python threading模块基础用法与守护线程详解
本文详细解析Python中threading模块的基本使用方法,包括如何正确传递元组参数、启动与等待线程执行。重点介绍守护线程(Daemon Thread)的设置及其对主线程结束的影响,通过代码示例说明setDaemon(True)的正确使用时机及注意事项,帮助开发者避免线程挂起或意外终止的问题。
Python threading模块基础用法与守护线程详解
在多线程编程中,参数传递有着严格的格式要求。如果传入的参数不符合规范,程序将会报错。
import _thread as thread
import time
def loop1(in1):
print("Start loop 1 at:", time.ctime())
print("我是参数", in1)
time.sleep(4)
print("End loop 1 at:", time.ctime())
def loop2(in1, in2):
print("Start loop 2 at:", time.ctime())
print("我是参数", in1, "和参数 ", in2)
time.sleep(4)
print("End loop 1 at:", time.ctime())
def main():
print("Starting at:", time.ctime())
thread.start_new_thread(loop1, ("liuming", ))
# 上面我们传参的时候, 我用的是:(“ liuming”), 这里面是没有逗号的, 结果编译报错, 告诉我, 这里面必须传入元组
# 因此, 我才在里面加了一个逗号, 使其变成一个元组
thread.start_new_thread(loop2, ("zhanglei", "liuhao"))
print("All done at:", time.ctime())
if __name__ == "__main__":
main()
while True:
time.sleep(10)

threading模块的核心用法
threading模块的核心用法
最直接的方式是通过threading.Thread类来创建线程实例。
其基本语法格式如下:
t = threading.Thread(target=函数体, args=(参数1, 参数2, ...)),其中args参数必须接收一个元组。
调用t.start()方法即可启动多线程。
调用t.join()方法可以阻塞当前线程,直到该子线程执行完毕。
def main():
print("Start at :", time.ctime())
t1 = threading.Thread(target = loop1, args = ("王老大", ))
t1.start()# 启动多线程
t2 = threading.Thread(target = loop2, args = ("孙子", "好吗"))
t2.start()
t1.join()
t2.join()
print("End at :", time.ctime())
if __name__ == "__main__":
main()

通过上述代码可以看出,虽然启动了两个子线程,但主程序会等待所有子线程执行完毕后,才会打印最后的“结束”语句。
守护线程的设置与注意事项
2. 守护线程(Daemon Thread)
设置语法为:线程实例.setDaemon(True)。
其主要作用包括:
(1)若将子线程设置为守护线程,当主线程结束时,该子线程会自动退出;
(2)通常认为守护线程并不重要,或者不允许其脱离主线程独立运行;
(3)守护线程的行为表现可能与具体的运行环境有关。
注意事项:setDaemon(True)语句必须写在start()方法之前,否则可能导致子线程被无限期挂起并引发运行报错。

def fun():
print("Start fun")
time.sleep(2)
print("End fun")
print('Main thread')
t3 = threading.Thread(target = fun, args = ())
t3.setDaemon(True)
t3.start()
time.sleep(1)
print("Main thread End")

从执行结果可以看出,主线程结束后(即打印完“Main thread End”),子线程的最后一次打印并未输出,程序随即结束。这说明当主线程终止时,无论子线程执行到哪一步,都会被强制终止(kill),这符合我们的预期设定。
三、完整源代码
文件名为:d24_2_usage_of_threading.py
代码托管地址:https://github.com/ruigege66/Python_learning/blob/master/d24_2_usage_of_threading.py
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













