python的多线程中的join的作用

1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样
例子如下:

import threading
import time

def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘,time.time())
t = threading.Thread(target=say,args=(‘eve‘,))
t.start()
t.join()
print(‘___主线程结束___‘,time.time())

import threading
import time

def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘,time.time())
t = threading.Thread(target=say,args=(‘eve‘,))
t.start()
#t.join()
print(‘___主线程结束___‘,time.time())

2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。
例子如下:

import threading
import time
def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
# t.join()
print(‘___主线程结束___‘)

3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。
例子如下:
①.主线程超时时间小于子线程运行时间,主线程结束了,不管子线程是否结束都结束了

import threading
import time
def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
t.join(2)
print(‘___主线程结束___‘)

②.主线程超时时间大于子线程运行时间,主线程等待子线程结束候结束了

import threading
import time
def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
t.join(4)
print(‘___主线程结束___‘)

4 如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。

import threading
import time
def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(False)
t.start()
# t.join(4)
print(‘___主线程结束___‘)

5 如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。
例子如下:

import threading
import time
def say(name):
    print(‘%s is start ‘ % name)
    time.sleep(3)
    print(‘%s is stop‘%name)

print(‘___主线程开始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
t.join(4)
print(‘___主线程结束___‘)

原文地址:http://blog.51cto.com/853056088/2162714

时间: 2024-11-08 07:10:23

python的多线程中的join的作用的相关文章

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

Python多线程中阻塞(join)与锁(Lock)的使用误区

参考资料:https://blog.csdn.net/cd_xuyue/article/details/52052893 1使用两个循环分别处理start和join函数.即可实现并发. threads = [Thread() for i in range(5)] for thread in threads: thread.start() for thread in threads: thread.join() 2 要保证锁对于多个子线程来说是共用的,即不要在Thread的子类内部创建锁. 原文地

多线程中volatile关键字的作用

原文链接:https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写.难验证.难调试.难维护,这通常是件苦差事.不正确的多线程程序可能可以运行很多年也不出一点错,直到满足某些临界的条件时,才出现意想不到的奇怪错误. 不用说,编写多线程程序的程序员需要使用可能得到的所有帮助.这期专栏将专注于讨论竞争条件(race conditions)——这通常是多线程程序中各种麻烦的根源——深入了解它并提供一些工具来防止竞争

Java多线程中的join方法

新建一个Thread,代码如下: 1 package com.thread.test; 2 3 public class MyThread extends Thread { 4 private String name; 5 public MyThread(String name) { 6 this.name = name; 7 } 8 @Override 9 public void run() { 10 for (int i = 0; i < 100; i++) { 11 System.out.

python的多线程到底有没有用?

在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? 是真的.这个就是因为传说中的GIL(全局解释锁)的存在.不明白这个词的可以去百度一下,我解释不好(大家都是程序猿你懂的,我写错一个词就要挨喷了,就算我没写错对方理解错了,我也一样要挨喷).有了这样一个看似bug的存在,就导致了上面说的情况:同一时刻内,python的线程只有一条在CPU里面运行.

python线程中的join(转)

Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面一. 知识点二:当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一

FAQ: Python中if __name__ == &#39;__main__&#39;:作用

#hello.pydef sayHello(): str="hello" print(str); if __name__ == "__main__": print ('This is main of module "hello.py"') sayHello() python作为一种脚本语言,我们用python写的各个module都可以包含以上那么一个类似c中的main函数,只不过python中的这种__main__与c中有一些区别,主要体现在:

浅析python 中__name__ = &#39;__main__&#39; 的作用

很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. __name__ 是当前模块名,当模块

谈谈python 中__name__ = &#39;__main__&#39; 的作用

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流