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运算符重载用法实例
May 28 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
python之Character string(实例讲解)
Sep 25 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
python实现内存监控系统
Mar 07 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python对于requests的封装方法详解
Jan 03 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php中session使用示例
2014/03/29 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
php生成圆角图片的方法
2015/04/07 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
关于js注册事件的常用方法
2013/04/03 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
微信小程序文字显示换行问题
2019/07/28 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
Python自动重试HTTP连接装饰器
2015/04/28 Python
Python标准库defaultdict模块使用示例
2015/04/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
python selenium 弹出框处理的实现
2019/02/26 Python
常用的10个Python实用小技巧
2020/08/10 Python
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
心理健康心得体会
2014/01/02 职场文书
合作协议书范本
2014/04/17 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js