zoukankan      html  css  js  c++  java
  • python学习笔记——Thread常用方法

    http://blog.sina.com.cn/s/blog_4b5039210100ewie.html

    Thread对象中的一些方法:

        以前说过多线程,用到threading模块中的Thread对象,其中的start和run方法比较熟悉了,start()是重载了Thread对象中的run方法,其实作用还是,当执行这个start方法的时候,将运行run方法。

        今天看看其他几个重要的方法:

       

    1 join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的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(20)

                 print self.id

                

    >>> def func():

          t.start()

          for i in range(5):

                 print i

                

    >>> t=MyThread(2)

    >>> func()

    0

    1

    2

    3

    4

    >>> 2

    可以看到,虽然在func里面线程已经运行,但是函数并没有等线程运行结束在执行,而是先把func执行完毕,打印0到4,然后等sleep(20),20秒结束后,这个MyThread(2),传进去的2才打印出。

    >>> def func():

          t.start()

          t.join()

          for i in range(5):

                 print i

                

    >>> t=MyThread(3)

    >>> func()

    3

    0

    1

    2

    3

    4

    >>> 

    而这个呢,是当t.start()运行开始计时,20秒后,打印出id是3,然后func才接着运行,打印出0到4.

    2. setDaemon()方法

    这个方法基本和join是相反的。当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法啦,

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

    import threading

    import time

    class myThread(threading.Thread):

        def __init__(self,threadname):

            threading.Thread.__init__(self,name=threadname)

        def run(self):

            time.sleep(5)

            print self.getName()

    def fun1():

        t1.start()

        print 'fun1 done'

    def fun2():

        t2.start()

        print 'fun2 done'

    t1=myThread('t1')

    t2=myThread('t2')

    t2.setDaemon(True)

    fun1()

    fun2()

    上面这个例子,按照我们设想的输出时:
    fun1 done

    fun2 done

     t1

    但是实际上我们在交互模式,主线程只有在python退出时终止,所以结果t2也是被打印出来啦。

    3 .isAlive方法

    当线程创建以后,可以使用Thread对象的isAlive方法查看线程是否运行。

    >>> import threading

    >>> import time

    >>> class myThread(threading.Thread):

           def __init__(self,id):

                  threading.Thread.__init__(self)

                  self.id=id

           def run(self):

                  time.sleep(5)

                  print self.id

                 

    >>> t=myThread(1)

    >>> def func():

           t.start()

           print t.isAlive()

          

    >>> func()

    True

    >>> 1

    4. 线程名

    当线程创建后可以设置线程名来区分不同的线程,以便对线程进行控制。线程名可以在类的初始化函数中定义,也可以使用Thread对象的setName方法设置。下面是不同的方法来设置线程名。

    >>> import threading

    >>> class mythread(threading.Thread):

           def __init__(self,threadname):

                  threading.Thread.__init__(self,name=threadname)

           def run(self):

                  print self.getName()

                 

    >>>

    >>> t1=mythread('t1')

    >>> t1.getName()

    't1'

    >>> t1.setName('T')

    >>> t1.getName()

    'T'

    >>> t2=mythread('t2')

    >>> t2.start()

    t2

    >>>

    >>> t2.getName()

    't2'

    >>> t2.setName('TT')

    >>> t2.getName()

    'TT'

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/lvxiuquan/p/3080387.html
Copyright © 2011-2022 走看看