python的进程和线程经常用到,之前一直不明白threading的join和setDaemon的区别和用法,今天特地研究了一下。multiprocessing中也有这两个方法,同样适用,这里以threading的join和setDaemon举例。

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

原型:join([timeout])

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

例子:

# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep def search():
sleep(5)
print 2 if __name__ == '__main__':
t = Thread(target=search)
t.start()
# t.join()
print 1

执行后的结果:


运行后,当打印完1停顿了5秒后才打印2。解释:线程t开始后,需要睡5s,主线程并没有等待线程t执行完,就开始往下执行。

现在,我们把t.join()注释去掉(其他代码不变),看看有什么变化,例子:

# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep def search():
sleep(5)
print 2 if __name__ == '__main__':
t = Thread(target=search)
t.start()
t.join()
print 1

执行后的结果:

2
1

运行后,发现停顿了5秒后才打印2,然后立即打印了1。解释:当程序运行到t.join()时,停在了t.join()处,等待线程t执行完,然后开始往下执行。

2.

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

例子:

from threading import Thread
from time import sleep def search():
for i in range(5):
sleep(1)
print 2 if __name__ == '__main__':
t = Thread(target=search)
# t.setDaemon(True)
t.start()
print 1

执行后的结果:

1
2
2
2
2
2

运行过程中,程序还没运行完时,关闭程序。会发现程序还在打印2。这是因为主线程默认等待线程t执行完才关闭,主线程执行完,子线程t没有执行完,程序就被挂起,一直等待子线程执行完毕。

现在,我们把t.setDaemon(True)的注释删掉,再执行查看结果。例子:

# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep def search():
for i in range(5):
sleep(1)
print 2 if __name__ == '__main__':
t = Thread(target=search)
t.setDaemon(True)
t.start()
print 1

执行结果:

1

执行发现,程序在打印完1后就停止了。这是因为主线程执行完以后,不再等待子线程是否执行完,立马结束。

threading的join和setDaemon的区别总结:如果主线程中调用了join(),程序会阻塞在调用处,直到子线程执行完才往下执行。如果没调用,主线程则无需等待,直接往下执行。如果主线程中调用了setDaemon(True),则当程序关闭或者执行完后,子线程立马关闭,不管其是否执行完。如果主线程中没有调用setDaemon(True),则当程序关闭或者执行完后,子线程会继续执行,直到执行完。join管阻塞,setDaemon管结束。

正常开发中,当开启了多线程,为了不让程序阻塞,同时主线程关闭时,子线程能够都同时关闭,会用下面的方法。

# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep def search():
for i in range(5):
sleep(1)
print 2 def insert():
for i in range(5):
sleep(0.9)
print 3 if __name__ == '__main__':
task1 = Thread(target=search)
task2 = Thread(target=insert)
task1.setDaemon(True)
task2.setDaemon(True)
task1.start()
task2.start()
while True:
sleep(10)

Python中threading的join和setDaemon的区别[带例子]的更多相关文章

  1. Python中threading的join和setDaemon的区别及用法[例子]

    Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join() ...

  2. Python中threading的join和setDaemon的区别及用法

    Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下: join([time]): 等待至线程中止.这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或 ...

  3. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  4. python中dtype,type,astype的区别

    python中dtype,type,astype的区别 type() dtype() astype() 函数名称 用法 type 返回参数的数据类型 dtype 返回数组中元素的数据类型 astype ...

  5. python中threading的用法

    摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html 以及:http://blog.chinaunix.net/uid-11131943- ...

  6. Python中os与sys两模块的区别

    <os和sys的官方解释> ➤os os: This module provides a portable way of using operating system dependent ...

  7. Python基础学习-Python中最常见括号()、[]、{}的区别

    Python中最常见括号的区别: 在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{}:其作用也不相同,分别用来代表不同的Python基本内置数据类型. Python中的 ...

  8. 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

    当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...

  9. Python中function(函数)和methon(方法)的区别

    在Python中,对这两个东西有明确的规定: 函数function —— A series of statements which returns some value to a caller. It ...

随机推荐

  1. VS2015 : error LNK1168

    VC在重新生成Debug目录下的exe文件时,需要先删除原先的exe文件.但因为文件正在运行或是被锁定等原因,删除不了,于是出现 LNK1168错误.可以到任务管理器先将exe文件关闭,一个简单粗暴的 ...

  2. TCP常用方法

    //格式化为16进制输出指令 function fromateSendCode($code){ $codeArr = getCodeWithSpace($code); for($i=0; $i< ...

  3. SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。

    使用SSIS的oledb数据源时的参数按钮如下图: 但是在使用ADO.NET源连接到MYSQL时,没有这个参数按钮,如何向数据流的sql command传递参数呢? steps: 1. 在 控制流 选 ...

  4. python __new__ __init__ 区别

    参数 __new__的第一个占位参数是class对象 __init__的第一个占位参数是class的实例对象 其他的参数应一致 作用 __new__ 用来创建实例,在返回的实例上执行__init__, ...

  5. CSS修改Autocomplete样式

    举个场景:在用户登录成功的时候,浏览器有时候会咨询你是否记住密码,当你记住密码下次登录的时候,标签会自动填充,但是这样会造成样式不统一,解决办法如下: input:-webkit-autofill, ...

  6. 谈PHP中的钩子

    钩子,英文为hooks.在程序中应用相当广泛,但是究竟什么是钩子呢?本人介绍一下目前本人对钩子的理解和相关心得. 假如有这么一段程序流: function fun(){ funA(); funB(); ...

  7. Linux 安装reids

    1.下载: wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2.解压: .tar.gz 3.安装: cd /redis- make ...

  8. PHP知识点总结4

    file1.php <?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { stat ...

  9. wine使用

    wineqq 不能输入问题winecfg在 wine 设置里,选择函数库添加 riched20, 就行了(原装领先于内建) wineqq 可以输入不能输入中文问题原因:fictx组件缺失 搜狗输入法没 ...

  10. IE下的圆角

    元素{ position: relative;/*必须*/ z-index: 10;/*必须*/ border-radius: 8px; -moz-border-radius: 8px; -webki ...