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 Django连接MySQL数据库做增删改查
Nov 07 Python
Django卸载之后重新安装的方法
Mar 15 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
详解Python核心对象类型字符串
Feb 11 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
python统计字母、空格、数字等字符个数的实例
Jun 29 Python
pycharm 配置远程解释器的方法
Oct 28 Python
python实现单链表的方法示例
Sep 03 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
Pytorch转onnx、torchscript方式
May 25 Python
Python urllib3软件包的使用说明
Nov 18 Python
分享一个python的aes加密代码
Dec 22 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
input框中的name和id的区别
2016/11/16 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
JS实现多功能计算器
2020/10/28 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python 初始化一个定长的数组实例
2019/12/02 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
Ibatis如何调用存储过程
2015/05/15 面试题
软件测试工程师结构化面试题库
2016/11/23 面试题
工厂厂长的职责
2013/12/12 职场文书
大学生入党思想汇报
2014/01/14 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
在Docker容器中部署SQL Server
2022/04/11 Servers