python 在threading中如何处理主进程和子线程的关系


Posted in Python onApril 25, 2020

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

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

join使用实例如下:

import time
import random
import threading
 
class worker(threading.Thread):
  def __init__(self): 
    threading.Thread.__init__(self) 
  def run(self):
    t = random.randint(1,10)
    time.sleep(t)
    print "This is " + self.getName() + ";I sleep %d second."%(t)
    
tsk = []
for i in xrange(0,5):
  time.sleep(0.1)
  thread = worker()
  thread.start()
  tsk.append(thread)
for tt in tsk:
  tt.join()
print "This is the end of main thread."

运行结果如下:

# python testjoin.py 
This is Thread-3;I sleep 2 second.
This is Thread-1;I sleep 4 second.
This is Thread-2;I sleep 7 second.
This is Thread-4;I sleep 7 second.
This is Thread-5;I sleep 7 second.
This is the end of main thread.

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

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

setDaemon函数使用实例:

import time
import random
import threading
 
class worker(threading.Thread):
  def __init__(self): 
    threading.Thread.__init__(self) 
  def run(self):
    t = random.randint(1,10)
    time.sleep(t)
    print "This is " + self.getName() + ";I sleep %d second."%(t)
    
tsk = []
for i in xrange(0,5):
  time.sleep(0.1)
  thread = worker()
  thread.setDaemon(True)
  thread.start()
  tsk.append(thread)
print "This is the end of main thread."

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

运行结果如下:

#python testsetDaemon.py
This is the end of main thread.

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

import time
import random
import threading
 
class worker(threading.Thread):
  def __init__(self): 
    threading.Thread.__init__(self) 
  def run(self):
    t = random.randint(1,10)
    time.sleep(t)
    print "This is " + self.getName() + ";I sleep %d second."%(t)
    
tsk = []
for i in xrange(0,5):
  time.sleep(0.1)
  thread = worker()
  thread.start()
  tsk.append(thread)
print "This is the end of main thread."

运行结果如下:

# python testthread.py 
This is the end of main thread.
This is Thread-4;I sleep 1 second.
This is Thread-3;I sleep 7 second.
This is Thread-5;I sleep 7 second.
This is Thread-1;I sleep 10 second.
This is Thread-2;I sleep 10 second.

补充知识:Python Thread和Process对比

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

# coding=utf-8
import logging
import multiprocessing
import os
import time
from threading import Thread

logging.basicConfig(
  level=logging.INFO,
  format="%(asctime)s 【 %(process)d 】 %(processName)s %(message)s"
)


def func (i):
  # logging.info(f'子:{os.getpid()},\t{i}')
  return f'子:{os.getpid()},\t{i}'


def main (ctx):
  start01 = time.time()
  ts = [Thread(target=func, args=(i,)) for i in range(100)]
  [t.start() for t in ts]
  [t.join() for t in ts]
  end01 = time.time() - start01
  logging.info(f"线程花费的时间:{end01}秒")
  
  start02 = time.time()
  ps = [ctx.Process(target=func, args=(i,)) for i in range(100)]
  [p.start() for p in ps]
  [p.join() for p in ps]
  end02 = time.time() - start02
  logging.info(f"进程花费的时间:{end02}秒")


if __name__ == '__main__':
  # windows 启动方式
  multiprocessing.set_start_method('spawn')
  # 获取上下文
  ctx = multiprocessing.get_context('spawn')
  # 检查这是否是冻结的可执行文件中的伪分支进程。
  ctx.freeze_support()
  main(ctx)

输出:

2019-10-06 14:17:22,729 【 7412 】 MainProcess 线程花费的时间:0.012967586517333984秒
2019-10-06 14:17:25,671 【 7412 】 MainProcess 进程花费的时间:2.9418249130249023秒

以上这篇python 在threading中如何处理主进程和子线程的关系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Python常用小技巧总结
Jun 01 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
python write无法写入文件的解决方法
Jan 23 Python
python实现支付宝转账接口
May 07 Python
python的debug实用工具 pdb详解
Jul 12 Python
wxpython绘制音频效果
Nov 18 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
如何利用python进行时间序列分析
Aug 04 Python
一文详述 Python 中的 property 语法
Sep 01 Python
Python 多进程原理及实现
Dec 21 Python
python标准库ElementTree处理xml
May 20 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 #Python
解决python父线程关闭后子线程不关闭问题
Apr 25 #Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 #Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 #Python
python 追踪except信息方式
Apr 25 #Python
Python实现捕获异常发生的文件和具体行数
Apr 25 #Python
python IDLE添加行号显示教程
Apr 25 #Python
You might like
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
php笔记之:AOP的应用
2013/04/24 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
php树型类实例
2014/12/05 PHP
php中使用websocket详解
2016/09/23 PHP
PDO::_construct讲解
2019/01/27 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
Javascript 面向对象特性
2009/12/28 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
JS实现拼图游戏
2021/01/29 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
Python 循环终止语句的三种方法小结
2019/06/24 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Django中使用Celery的方法步骤
2020/12/07 Python
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
商务英语本科生的自我评价分享
2013/11/15 职场文书
2014自主招生自荐信策略
2014/01/27 职场文书
幼儿园家长评语
2014/02/10 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
申报优秀教师材料
2014/12/16 职场文书
公司开除员工通知
2015/04/22 职场文书