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 相关文章推荐
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
python 爬取微信文章
Jan 30 Python
python 删除非空文件夹的实例
Apr 26 Python
Python使用folium excel绘制point
Jan 03 Python
Django中的FBV和CBV用法详解
Sep 15 Python
django 简单实现登录验证给你
Nov 06 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
如何通过python检查文件是否被占用
Dec 18 Python
python切片作为占位符使用实例讲解
Feb 17 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 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中const与define的应用区别
2013/06/18 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
vue中实现高德定位功能
2019/12/03 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python sys.path详细介绍
2013/10/17 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
实例讲解Python爬取网页数据
2018/07/08 Python
使用Python进行目录的对比方法
2018/11/01 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
小学学习雷锋活动总结
2014/07/03 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
奖学金个人总结
2015/03/04 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
导游词之日月潭
2019/11/05 职场文书
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript