精华内容
下载资源
问答
  • 由于坑爹的学校坑爷的专业,多线程编程老师从来没教过,多线程的概念也是教的稀里糊涂,本人python也是菜鸟级别,所以遇到多线程的编程就傻眼了,别人用的顺手的join函数我却偏偏理解不来。早上...

    今天去辛集买箱包,下午挺晚才回来,又是恶心又是头痛。恶心是因为早上吃坏东西+晕车+回来时看到车祸现场,头痛大概是烈日和空调混合刺激而成。没有时间没有精神没有力气学习了,这篇博客就说说python中一个小小函数。

    由于坑爹的学校坑爷的专业,多线程编程老师从来没教过,多线程的概念也是教的稀里糊涂,本人python也是菜鸟级别,所以遇到多线程的编程就傻眼了,别人用的顺手的join函数我却偏偏理解不来。早上在去辛集的路上想这个问题想到恶心,回来后继续写代码测试,终于有些理解了(python官方的英文解释理解不了,网友的解释也不够详细,只能自己钻)。

    测试用的代码如下:

    # coding: utf-8

    # 测试多线程中join的功能

    import threading, time

    def doWaiting():

    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"

    time.sleep(3)

    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"

    def doWaiting1():

    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"

    time.sleep(8)

    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"

    tsk = []

    thread1 = threading.Thread(target = doWaiting)

    thread1.start()

    tsk.append(thread1)

    thread2 = threading.Thread(target = doWaiting1)

    thread2.start()

    tsk.append(thread2)

    print 'start join: ' + time.strftime('%H:%M:%S') + "\n"

    for tt in tsk:

    tt.join()

    print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

    这个小程序使用了两个线程thread1和thread2,线程执行的动作分别是doWaiting()和doWaiting1(),函数体就是打印「开始」+休眠3秒+打印「结束」,分别附加上时间用来查看程序执行的过程。后面用start()方法同步开始执行两个线程。然后开始循环调用两个线程的join()方法,在此之前和之后都会用print函数做好开始结束的标记。我们主要观察for tt in tsk: tt.join()。

    join()不带参数的情况下,执行如下:

    201492110804080.jpg?20148211823

    可以看到,两个线程并行执行,进程1在3s后结束,进程2在8s后结束,然后回到主进程,执行打印「end join」。

    下面把参数设置成超时2s,即tt.join(2),执行如下:

    201492110834859.jpg?20148211842

    两个线程开始并发执行,然后执行线程1的join(2),等线程1执行2s后就不管它了,执行线程2的join(2),等线程2执行2s后也不管它了(在此过程中线程1执行结束,打印线程1的结束信息),开始执行主进程,打印「end join」。4s之后线程2执行结束。

    总结一下:

    1.join方法的作用是阻塞主进程(挡住,无法执行join以后的语句),专注执行多线程。

    2.多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个。

    3.无参数,则等待到该线程结束,才开始执行下一个线程的join。

    4.设置参数后,则等待该线程这么长时间就不管它了(而该线程并没有结束)。不管的意思就是可以执行后面的主进程了。

    最后附上参数为2时的程序执行流程表,自己画的orz,这样看起来更好理解。

    201492110858832.jpg?2014821196

    展开全文
  • Python多线程编程的时候,经常需要用到join函数和setDaemon函数。之前对这两个函数一直理解不是很到位。今天查阅了很多资料,对两个函数的认识更加的深入一些了。 join([timeout])可以参考Python文档说明。大概...

          在Python多线程编程的时候,经常需要用到join函数和setDaemon函数。之前对这两个函数一直理解不是很到位。今天查阅了很多资料,对两个函数的认识更加的深入一些了。

          join([timeout])可以参考Python文档说明。大概意思就是调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么主调线程将一直阻塞直到被调用线程结束。

          借鉴一下别人的代码说明情况:

    #!/usr/bin/env python
    
    import threading
    
    import time
    
    class MyThread(threading.Thread):
    
        def __init__(self, func, args, name=''):
    
            threading.Thread.__init__(self)
    
            self.name=name
    
            self.func=func
    
            self.args=args
    
        def run(self):
    
            apply(self.func, self.args)
    
    def print_func(num):
    
        while True:
    
            print "I am thread%d" % num
    
            time.sleep(1)
    
    threads = []
    
    t1 = MyThread(print_func, (1, ), print_func.__name__)
    
    threads.append(t1)
    
    t2 = MyThread(print_func, (2, ), print_func.__name__)
    
    threads.append(t2)
    
    for t in threads:
    
        t.start()
    
        t.join()
    
    print "ok\n"
    
    
    
    

          程序的运行输出如下:

    2

          查看程序输出发现只有第一个子线程在调用,第二个子线程以及父线程都没有继续走下去。这是因为join函数一直在等待子线程结束,但是循环使得子线程一直没有结束,这样后续子线程和主线程都阻塞了。使得只有第一个子线程在循环执行。

          改一下最后面的代码为:

    for t in threads:
    
        t.start()
    
    for t in threads:
    
        t.join()
    
    
    
    

          运行结果如下所示:

    3

          可以看到线程一和线程二在交替执行。两个子线程完成之前,父线程的print "ok\n"都不会执行。

          修改一下使得两个子线程运行时间不一样,会是怎样的结果呢?

    #!/usr/bin/env python
    
    import threading
    
    import time
    
    class MyThread(threading.Thread):
    
        def __init__(self, func, args, name=''):
    
            threading.Thread.__init__(self)
    
            self.name=name
    
            self.func=func
    
            self.args=args
    
        def run(self):
    
            apply(self.func, self.args)
    
    def print_func1(num):
    
        while True:
    
            print "I am thread%d" % num
    
            time.sleep(1)
    
    def print_func2(num):
    
        while True:
    
            print "I am thread%d" % num
    
            time.sleep(2)
    
    threads = []
    
    t1 = MyThread(print_func1, (1, ), print_func1.__name__)
    
    threads.append(t1)
    
    t2 = MyThread(print_func2, (2, ), print_func2.__name__)
    
    threads.append(t2)
    
    for t in threads:
    
        t.start()
    
    for t in threads:
    
        t.join()
    
    print "ok\n"
    
    
    
    

          运行结果如下图所示:

    4 

          可以看到一个子线程的完成不会影响另外一个子线程,父线程仍然一直被阻塞,需要等待两个子线程完成之后才会打印结果。

          setDaemon()可以参考Python文档说明。大概意思就是可以设置setDaemon的参数为True来表示将该线程指定为守护线程,如果参数为False就不指定线程为守护线程。设置setDaemon的参数为True之后。主线程和子线程会同时运行,主线程结束运行后,无论子线程运行与否,都会和主线程一起结束。

          借鉴一下别人的代码说明情况:

    #!/usr/bin/env python
    
    import threading
    
    import time
    
    class MyThread(threading.Thread):
    
        def __init__(self, func, args, name=''):
    
            threading.Thread.__init__(self)
    
            self.name=name
    
            self.func=func
    
            self.args=args
    
        def run(self):
    
            apply(self.func, self.args)
    
    def print_func(num):
    
        while True:
    
            print "I am thread%d" % num
    
            time.sleep(1)
    
    threads = []
    
    t1 = MyThread(print_func, (1, ), print_func.__name__)
    
    threads.append(t1)
    
    t2 = MyThread(print_func, (2, ), print_func.__name__)
    
    threads.append(t2)
    
    for t in threads:
    
        t.setDaemon(True)
    
        t.start()
    
    print "ok\n"
    
    
    
    

          运行结果如下图所示:

    1

          查看程序输出后可以发现print_func函数中的循环没有继续执行下去就退出了,由于setDaemon(True)把子线程设置为守护线程,子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "ok\n"后,没有等待子线程是否完成,直接就退出了,同时子线程也一同结束。

    转载于:https://www.cnblogs.com/hiccup/p/5423964.html

    展开全文
  • python多线程 join()

    2020-06-23 18:11:35
    python多线程中,有join这一个方法,具体含义:其实就是阻塞当前调用它的线程,等待join执行完毕,当前线程继续执行。和java中的join函数的理解方式是一样的。 具体代码: import threading class T1(threading....

    join()

    python多线程中,有join这一个方法,具体含义:其实就是阻塞当前调用它的线程,等待join执行完毕,当前线程继续执行。和java中的join函数的理解方式是一样的。

    具体代码:

    
    import threading
    
    class T1(threading.Thread):
        i = 0
        def run(self):
            while self.i < 100000:
                self.i += 1
                print("T1---->" + str(self.i))
    
    class T2(threading.Thread):
        def run(self):
        	while True:
                print("I am T2")
    
    
    
    
    if __name__ == '__main__':
    	# 开启第一个线程
        t1 = T1()
        t1.start()
        # 开启第二个线程
        t2 = T2()
        t2.start()
        # 将第一个线程join()进去
        t1.join()
        
        while True:
            print("I am Main")
    

    这段代码执行之后,顺着程序来看:创建两个线程并开启之后,并将第一个线程join(),那么Main进程就会进入一种等待状态,但此时线程2并不会受到影响。等线程1结束之后,Main继续执行,线程2也在执行,那么打印结果就会交替输出。

    展开全文
  • Python多线程中的join函数的使用与含义

    join函数用的有几种,这里介绍的是在线程,进程处的使用规则。

    简单的含义如下:

    A 线程正在运行,当B线程进行Join操作后,A线程会被阻断,进入等待队列。

    B线程执行,当B线程执行完毕后,B线程的资源收回,A线程进去执行队列。

    A线程继续进行执行。


    例子代码:

    __author__ = '杨鑫'
    import threading, time
    def doWaiting1():
        print ('start waiting1:' + time.strftime('%H:%M:%S') + '\n')
        time.sleep(3)
        print ('stop waiting1:' + time.strftime('%H:%M:%S') + '\n')
    
    def doWaiting2():
        print ('start waiting2:' + time.strftime('%H:%M:%S') + '\n')
        time.sleep(8)
        print ('stop waiting2:' + time.strftime('%H:%M:%S') + '\n')
    
    task = []
    thread1 = threading.Thread(target=doWaiting1)
    thread1.start()
    task.append(thread1)
    
    thread2 = threading.Thread(target=doWaiting2)
    thread2.start()
    task.append(thread2)
    
    print ('start join:' + time.strftime('%H:%M:%S') + '\n')
    for t in task:
        t.join()
    
    print ('end join:' + time.strftime('%H:%M:%S') + '\n')
    
    
    




    展开全文
  • Python多线程join()的用法

    千次阅读 2018-04-12 23:43:40
    Python多线程编程中,在实例代码中经常有 thread1.join()这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。 join的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,...
  • python多线程获取函数返回值

    千次阅读 2019-10-18 15:07:27
    将方法名和参数传给Thread()的构造函数; 封装成类可以获取子线程的返回值 具体例子: 用4个线程分别计算4个列表中元素的平方值 import threading import random class MyClass(threading.Thread): ...
  • 通过以下实例可以get到join()函数的作用:如果thread是某个子线程,则调用thread.join()的作用是确保thread子线程执行完毕后才能执行下一个线程。下面第一个例子中没有调用join()函数,故没有这个限制,所有线程执行...
  • Python多线程2 join()

    千次阅读 2020-01-11 11:21:48
    一句话:对于 线程i.join() 这一行代码,其后的代码都要等待线程i完成之后才能执行。 import threading import time def T1_job(): print('T1 start\n') time.sleep(1) print('T1 finished') def T2_job(): ...
  • threads=[] f=[fast,slow] l=len(f) for i in range(l): t=MyThread(f[i],(),str(i)) threads.append(t) for i in range(l): threads[i].start() for i in range(l): ... threads[i].join() p
  • Python线程join()方法

    千次阅读 2018-01-02 09:43:27
    1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样 2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,...
  • python多线程可返回函数结果可停止 python自带的多线程无法返回run函数调用target函数的返回结果,而且多线程难以停止运行会对编程造成很大的困扰 我在python多线程的守护进程找到了多线程停止的切入点 做个测试 def...
  • Python 多线程join()的用法

    千次阅读 2019-08-30 16:21:13
    对于多线程 Thread 对象的 join(timeout=None) 属性 官方解释是:直至启动的线程终止之前一直挂起,除非给出了 timeout(秒) ,否则会一直阻塞 其实真正的意思就是除非子线程也全部运行完毕,否则主线程一直挂起 下面...
  • Python 多线程 thread join() 的作用

    万次阅读 2018-03-03 00:23:59
    原文地址在 Python多线程编程中,在实例代码中经常有 thread1.join()这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。 join的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程...
  • Python之多线程:python多线程设计之同时执行多个函数命令详细攻略 目录 实现功能 采取方法 应用场景 实现功能 同时执行多个函数命令 采取方法 T1、单个实现 import threading threading....
  • Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子...
  • Python多线程编程中,经常碰到 thread.join()这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。 第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置...
  • python多线程教程:python多线程详解

    千次阅读 2020-02-03 11:49:20
    文章目录一、线程介绍二...python多线程详解 一、线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源...
  • 同一进程下的多个线程共享...某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明 简单的多线程 mport threading, time def test1(x): time.sleep(5) print(x**...
  • python多线程join的用法

    千次阅读 2017-05-16 11:25:49
    python多线程join是用来阻塞主线程的。  看下面的例子: def fast(): print "in fast" sleep(10) print "done in fast" def slow(): print "in slow" sleep(15) print "done in slow" 一个运行快,一个...
  • Python中利用强大的threading模块可以很容易的实现多线程开发,提高运行速度。这一般是对某个进行大量计算操作的的函数进行多线程处理,然后合并各线程的结果。获取函数返回值的方法可以如下: 1). 利用...
  • 主要介绍了Python多线程编程(三):threading.Thread类的重要函数和方法,本文讲解了线程名称、join方法、setDaemon方法等内容,需要的朋友可以参考下
  • 1. 多线程的概念 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的...
  • 关于阻塞主线程 join的错误用法 Thread.join() 作用为阻塞主线程,即在子线程未返回的时候,主线程等待...1. 第一次循环中,主线程通过start函数激活线程1,线程1进行计算. 2. 由于start函数不阻塞主线程,在线程1进行运算
  • python多线程

    2021-02-22 22:17:25
    多线程(mult-tHreadings) 目录 什么是多线程 添加线程 add thread join功能 Queue功能 不一定有效率 GIL ...多线程是加速程序计算的有效方式,Python多线程模块threading上手快速简单,从这节开始我们就教大
  • 目录导入模块测试函数多线程调用测试函数多进程调用测试函数普通循环调用测试函数测试结果 导入模块 import time from threading import Thread from multiprocessing import Process, Pool 测试函数 def fun(): ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,715
精华内容 13,486
热门标签
关键字:

python多线程join函数

python 订阅