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读写配置文件的方法
Jun 03 Python
Python入门_条件控制(详解)
May 16 Python
vscode 远程调试python的方法
Dec 01 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
详解Python3中ceil()函数用法
Feb 19 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
Python之字符串的遍历的4种方式
Dec 08 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 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之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
DWR Ext 加载数据
2009/03/22 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
营业员实习自我鉴定
2013/12/07 职场文书
教师开学感言
2014/02/14 职场文书
班班通校本培训方案
2014/03/12 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
商业计划书之服装
2019/09/09 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL