浅谈Python中threading join和setDaemon用法及区别说明

Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。

1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。

原型:join([timeout])

里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。

例子:

import threading
import time
class MyThread(threading.Thread):
  def __init__(self,id):
    threading.Thread.__init__(self)
    self.id = id
  def run(self):
    x = 0
    time.sleep(10)
    print self.id 

if __name__ == "__main__":
  t1=MyThread(999)
  t1.start()
  for i in range(5):
    print I

执行后的结果是:

0
1
2
3
4
999

机器上运行时,4和999之间,有明显的停顿。

解释:

线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是先把5次循环打印执行完毕(打印到4),然后sleep(10)后,线程t1把传进去的999才打印出来。

现在,我们把join()方法加进去(其他代码不变),看看有什么不一样,例子:

import threading
import time
class MyThread(threading.Thread):
  def __init__(self,id):
    threading.Thread.__init__(self)
    self.id = id
  def run(self):
    x = 0
    time.sleep(10)
    print self.id 

if __name__ == "__main__":
  t1=MyThread(999)
  t1.start()
  t1.join()
  for i in range(5):
    print I 

执行后的结果是:

999
0
1
2
3
4

机器上运行时,999之前,有明显的停顿。

解释:

线程t1 start后,主线程停在了join()方法处,等sleep(10)后,线程t1操作结束被join,接着,主线程继续循环打印。

2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

例子:就是设置子线程随主线程的结束而结束:

import threading
import time
class MyThread(threading.Thread):
  def __init__(self,id):
    threading.Thread.__init__(self)
  def run(self):
    time.sleep(5)
    print "This is " + self.getName() 

if __name__ == "__main__":
  t1=MyThread(999)
  t1.setDaemon(True)
  t1.start()
  print "I am the father thread." 

执行后的结果是:

I am the father thread.

可以看出,子线程t1中的内容并未打出。

解释:t1.setDaemon(True)的操作,将父线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。

程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。

如果子线程未完成,则主线程会等待子线程完成后再退出。

但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法了。

所以,join和setDaemon的区别如上述的例子,它们基本是相反的。

以上这篇浅谈Python中threading join和setDaemon用法及区别说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python使用Thread的setDaemon启动后台线程教程

    多线程编程当中, 线程的存在形态比较抽象. 通过前台线程\后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现) 后台线程与前台线程的直接区别是, 1)setDaemon(True): 当主线程退出时,后台线程随机退出; 2)setDaemon(False)(默认情况): 当主线程退出时,若前台线程还未结束,则等待所有线程结束,相当于在程序末尾加入join(). 实例: 例子描述:主线程调用giveures给出字符串s的md5摘要,同时在giveures当中启动一个

  • 举例详解Python中threading模块的几个常用方法

    threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.下面分别举例说明.先来看看通过继承threading.Thread类来创建线程的例子: #coding=gbk import threading, time, random count = 0 cl

  • Python threading的使用方法解析

    一. 例子:我们对传参是有要求的必须传入一个元组,否则报错 import _thread as thread import time def loop1(in1): print("Start loop 1 at:", time.ctime()) print("我是参数", in1) time.sleep(4) print("End loop 1 at:", time.ctime()) def loop2(in1, in2): print(&quo

  • Python线程threading模块用法详解

    本文实例讲述了Python线程threading模块用法.分享给大家供大家参考,具体如下: threading-更高级别的线程接口 源代码:Lib/threading.py 该模块在较低级别thread模块之上构建更高级别的线程接口.另请参见mutex和Queue模块. 该dummy_threading模块适用于threading因thread缺失而无法使用的情况 . 注意: 从Python 2.6开始,该模块提供 符合 PEP 8的别名和属性,以替换camelCase受Java的线程API启发

  • Python THREADING模块中的JOIN()方法深入理解

    看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join()方法的线程结束.(好难翻译,应该是这个意思) 哈哈,这个易懂. join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法. 复制代码 代码如下: #-*- encoding: gb2312 -*- im

  • 浅谈Python中threading join和setDaemon用法及区别说明

    Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法. 原型:join([timeout]) 里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接

  • 浅谈python中拼接路径os.path.join斜杠的问题

    调试程序的过程中,发现通过os.path.join拼接的路径出现了反斜杠 directory1='/opt/apps/upgradePackage' directory2='icp_v1.8.0' directory3=os.path.join(directory1,directory2) print('directory3 : %s' %directory3) 执行结果 directory3 : /opt/apps/upgradePackage\icp_v1.8.0 拼接的符号成了"\&quo

  • 浅谈Python中函数的参数传递

    1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add('abc','123') abc123 2.参数个数可选,参数有默认值的传递 >>> def myjoin(string,sep='_'): return sep.join(string) >>> myjoin('Test') 'T_e_s_t' >>>

  • 浅谈Python中os模块及shutil模块的常规操作

    如下所示: #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以字母顺序. 它不包括 '.' 和'..' 即使它在文件夹中. #只支持在 Unix, Windows 下使用 import os, sys # 打开文件 path=r'C:\Users\Administrator.SKY-20180518VHY\Desktop\rx\ore' dirs = os.listdir( path ) print(dirs) # 输出所有文件和文件夹 for fil

  • 浅谈Python中re.match()和re.search()的使用及区别

    1.re.match() re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None. 包含的参数如下: pattern: 正则模型 string : 要匹配的字符串 falgs : 匹配模式 match() 方法一旦匹配成功,就是一个match object对象,而match object对象有以下方法: group() 返回被 RE 匹配的字符串 start() 返回匹配开始的位置 end() 返回匹配结束的位置 span()返

  • 浅谈Python中文件夹和python package包的区别

    pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢 1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了. 当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件. 2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文

  • 浅谈python中copy和deepcopy中的区别

    在下是个编程爱好者,最近将魔爪伸向了Python编程.....遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深度复制,在这里我理解的是完全复制然后变成一个新的对象,复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响. 然后说一下copy,在这里我分为两类来说,一种是字典数据类型的copy函数,一种是copy包的copy函数. 一.字典数据类型的copy函数

  • 浅谈python中列表、字符串、字典的常用操作

    列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q

  • 浅谈python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个坑是如此之大,犹豫再三,还是只捡一下重要的内容来讲吧,不足的内容只能靠大家自己去补充了. 惯例声明一下,我使用的版本是 python2.7,版本之间可能存在差异. 好,在开讲之前,我们先思考一个问题,看代码: 为什么我只创建是为 a 赋值,就可以使用一些我没写过的方法? 可能会有小伙伴说:因为 a

  • 浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: >>> hasattr(list, 'append') True >>> hasattr(list, 'add') False getattr(object,name,default): 作用:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其

随机推荐