python在线程中处理主进程和子线程关系的方法

  介绍

这篇文章主要讲解了python在线程中处理主进程和子线程关系的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

之前用python的多线程,总是处理不好进程和线程之间的关系。后来发现了加入和setDaemon函数,才终于弄明白。下面总结一下。

1。使用加入函数后,主进程会在调用加入的地方等待子线程结束,然后才接着往下执行。

加入使用实例如下:

进口时间
  进口随机
  进口线程
  
  类人员(threading.Thread):
  def __init__(自我):
  threading.Thread.__init__(自我)
  def运行(自我):
  t=random.randint (10)
  time . sleep (t)
  打印“,这是“+ self.getName() +“,我睡觉% d第二!”% (t)
  
  啧啧=[]
  因为我在xrange (0 5):
  time . sleep (0.1)
  线程=工人()
  thread.start ()
  tsk.append(线程)
  的tt啧啧:
  tt.join ()
  打印“,这是主线程结束!”

运行结果如下:

 # python testjoin.py
  这是Thread-3;我睡2秒。
  这是线程1;我睡4秒。
  这是线程2;我睡眠7秒。
  这是Thread-4;我睡7秒。
  这是Thread-5;我睡7秒。
  这是主线程的结束。

这里创建了5个子线程,每个线程随机等待1 - 10秒后打印退出;主线程分别等待5个子线程结束。最后结果是先显示各个子线程,再显示主进程的结果。

2。如果使用的setDaemon函数,则与加入相反,主进程结束的时候不会等待子线程。

setDaemon函数使用实例:

进口时间
  进口随机
  进口线程
  
  类人员(threading.Thread):
  def __init__(自我):
  threading.Thread.__init__(自我)
  def运行(自我):
  t=random.randint (10)
  time . sleep (t)
  打印“,这是“+ self.getName() +“,我睡觉% d第二!”% (t)
  
  啧啧=[]
  因为我在xrange (0 5):
  time . sleep (0.1)
  线程=工人()
  thread.setDaemon(真正的)
  thread.start ()
  tsk.append(线程)
  打印“,这是主线程结束!”

这里设置主进程为守护进程,当主进程结束的时候,子线程被中止

运行结果如下:

# python testsetDaemon。py
这是主线程的结束。

3,如果没有使用加入和setDaemon函数,则主进程在创建子线程后,直接运行后面的代码,主程序一直挂起,直到子线程结束才能结束。

进口时间
  进口随机
  进口线程
  
  类人员(threading.Thread):
  def __init__(自我):
  threading.Thread.__init__(自我)
  def运行(自我):
  t=random.randint (10)
  time . sleep (t)
  打印“,这是“+ self.getName() +“,我睡觉% d第二!”% (t)
  
  啧啧=[]
  因为我在xrange (0 5):
  time . sleep (0.1)
  线程=工人()
  thread.start ()
  tsk.append(线程)
  打印“,这是主线程结束!”

运行结果如下:

 # python testthread.py
  这是主线程的结束。
  这是Thread-4;我睡1秒。
  这是Thread-3;我睡7秒。
  这是Thread-5;我睡7秒。
  这是线程1;我睡10秒。
  这是线程2,我睡眠10秒。

<强> Python对进程和线程比

原因:进程和线程的差距(方向不同,之针对这个实例)

 #=utf - 8编码
  导入日志
  进口多处理
  进口操作系统
  导入的时间
  从线程进口线程
  
  logging.basicConfig (=logging.INFO水平,
  格式=? (asctime)【% d(流程)】% (processName) %(消息)s"
  )
  
  
  def func(我):
  # logging.info (f # 39;子:{os.getpid()},{我}\ t & # 39;)
  返回f # 39;子:{os.getpid()},{我}\ t & # 39;
  
  
  def主要(ctx):
  start01=time.time ()
  ts=[线程(目标=函数,参数=(我)我的范围(100))
  [t.start ts (t))
  [t.join ts (t))
  ——start01 end01=time.time ()
  logging.info (f"线程花费的时间:{end01}秒“)
  
  start02=time.time ()
  (ctx ps=9?目标=函数,参数=(我)我的范围(100))
  [p.start p在ps) ()
  [p.join p在ps) ()
  ——start02 end02=time.time ()
  logging.info (f"进程花费的时间:{end02}秒“)
  
  
  if __name__==& # 39; __main__ # 39;:
  # windows启动方式
  multiprocessing.set_start_method(& # 39;产卵# 39;)
  #获取上下文
  ctx=multiprocessing.get_context(& # 39;产卵# 39;)
  #检查这是否是冻结的可执行文件中的伪分支进程。
  ctx.freeze_support ()
  主要(ctx) 

python在线程中处理主进程和子线程关系的方法