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数据结构之Array用法实例
Oct 09 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
浅谈Python爬虫基本套路
Mar 25 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
Python imread、newaxis用法详解
Nov 04 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
Python 如何实现数据库表结构同步
Sep 29 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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实现递归循环每一个目录
2010/08/08 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
javascript抖动元素的小例子
2013/10/28 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
下载给定网页上图片的方法
2014/02/18 Python
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python 从attribute到property详解
2020/03/05 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
学生手册评语
2014/05/05 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
入党积极分子考察意见
2015/06/02 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
python接口测试返回数据为字典取值方式
2022/02/12 Python
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers