程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python多线程,守护线程和非守护线程,线程的join方法,代码案例

hfteth 2025-02-09 12:26:52 技术文章 12 ℃

守护线程和非守护线程

守护线程&&非守护线程

守护线程,是和主线程一起结束的线程,叫守护线程,非守护线程,主线程的结束不影响该线程的执行,主线程结束非守护线程不会立刻结束,也叫用户线程。

Python的守护线程

Python多线程默认情况(设置线程setDaemon(False)),主线程执行完自己的任务后,就退出了,此时子线程会继续执行自己的任务,直到子线程任务结束。

开启线程的setDaemon(True)),设置子线程为守护线程,实现主程序结束,子程序立马全部结束功能。

代码案例

# 守护线程
import threading
import time

class MyThreading(threading.Thread):
  #初始化方法
  def __init__(self, name):
      super(MyThreading, self).__init__()
      self.name = name

  # 线程要运行的代码
  def run(self):
      print("我是线程%s" % self.name)
      time.sleep(2)
      print("线程%s运行结束" % self.name)

if __name__ == '__main__':
  t1 = MyThreading(1)
  t2 = MyThreading(2)
  start_time = time.time()
  t1.setDaemon(True)
  t1.start()
  t2.setDaemon(True)
  t2.start()
  end_time = time.time()
  print("两个线程一共的运行时间为:", end_time-start_time)

线程的join方法

join()方法

join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

非守护线程(线程daemon属性为False), join函数的timeout参数无效,主线程会一直等待子线程结束。

非守护线程(线程daemon属性为True),join函数的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。如果同时有N个子线程join(timeout),实际上主线程会等待的超时时间最长为:N * timeout, 即每个子线程的超时开始时刻是上一个子线程超时结束的时刻。

代码案例

import threading
import time

class MyThreading(threading.Thread):
  #初始化方法
  def __init__(self, name):
      super(MyThreading, self).__init__()
      self.name = name

  # 线程要运行的代码
  def run(self):
      print("我是线程%s" % self.name)
      time.sleep(3)
      print("线程%s运行结束" % self.name)

if __name__ == '__main__':
  threading_list = []
  start_time = time.time()
  for x in range(20):
    t = MyThreading(x)
    t.start()
    threading_list.append(t)

  for x in threading_list:
    # 为线程开启同步
    x.join()    

  end_time = time.time()
  print("20个线程一共的运行时间为:", end_time-start_time)

Tags:

最近发表
标签列表