Python 多线程实例

一、直接调用

#!/usr/bin/python
# -*- coding : utf-8 -*-
# 作者: Presley
# 时间: 2018-11-19
# 邮箱:1209989516@qq.com
# 这是我用来练习python多线程的测试脚本

import threading
import time


def sayhi(num): #定义每个线程要运行的函数
    print("runnin on number:%s" %num)
    time.sleep(3)

if __name__ == "__main__":
    t1 = threading.Thread(target=sayhi,args=(1,))
    t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例
    t1.start() #启动线程
    t2.start() #启动另一个线程
    print(t1.getName())
    print(t2.getName())

二、继承的方式启动一个线程

#!/usr/bin/python
# -*- coding : utf-8 -*-
# 作者: Presley
# 时间: 2018-11-19
# 邮箱:1209989516@qq.com
# 这是我用来练习python多线程的测试脚本

import threading
import time


class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self) #经典类的继承方法
        self.num = num
    def run(self): #定义每个线程要运行的函数 #这个类里面必须要写run这个方法并且必须写死了只能叫run, 线程.start即执行这个方法
        print("running on number:%s" %self.num)
        time.sleep(3)
if __name__ == "__main__":
    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()
    print(t1.getName())
    print(t2.getName())

三、join (等待线程执行完后才执行下一步)

#!/usr/bin/python
# -*- coding : utf-8 -*-
# 作者: Presley
# 时间: 2018-11-19
# 邮箱:1209989516@qq.com
# 这是我用来练习python多线程的测试脚本

import threading
import time


class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self) #经典类的继承方法
        self.num = num
    def run(self): #定义每个线程要运行的函数 #这个类里面必须要写run这个方法并且必须写死了只能叫run, 线程.start即执行这个方法
        print("running on number:%s" %self.num)
        time.sleep(3)

if __name__ == "__main__":
    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()
    print(t1.getName())
    print(t2.getName())
    t1.join() #等待t1执行完后执行下一步即t1.wait()
    t2.join()#等待t2执行完后执行下一步 即t2.wait()
    print("--main--")

四、并行等待,等最后一个线程执行完后执行下一步

#!/usr/bin/python
# -*- coding : utf-8 -*-
# 作者: Presley
# 时间: 2018-11-19
# 邮箱:1209989516@qq.com
# 这是我用来练习python多线程的测试脚本

import threading
import time


def sayhi(num): #定义每个线程要运行的函数
    print("runnin on number:%s" %num)
    time.sleep(3)

if __name__ == "__main__":
    t_list = []
    for i in range(10):
        t = threading.Thread(target=sayhi,args=[i,])
        t.start()
        t_list.append(t)
    for i in t_list:
        i.join()
    print("--main--")

 五、setDaemon

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

  1、

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.

   2、

#!/usr/bin/python
# -*- coding : utf-8 -*-
# 作者: Presley
# 时间: 2018-11-19
# 邮箱:1209989516@qq.com
# 这是我用来练习python多线程的测试脚本

import threading
import time


def run(n):
    print("[%s]------running------\n" %n)
    time.sleep(4)
    print("done")

def main():
    for i in range(5):
        print('aaa')
        print('bbb')
        print('ccc')
        t = threading.Thread(target=run,args=[i,])
        #time.sleep(1)
        t.start()
        t.join()
        print("starting thread",t.getName())
        print('ddd')


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

m.start()

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

print("--main thread done--")

执行结果:

aaa
bbb
ccc
[0]------running------

done
starting thread Thread-2
ddd
aaa
bbb
ccc
[1]------running------

done
starting thread Thread-3
ddd
aaa
bbb
ccc
[2]------running------

done
starting thread Thread-4
ddd
aaa
bbb
ccc
[3]------running------

done
starting thread Thread-5
ddd
aaa
bbb
ccc
[4]------running------

done
starting thread Thread-6
ddd
--main thread done--

 若main方法中去掉t.join结果为

aaa
bbb
ccc
[0]------running------
starting thread Thread-2
ddd
aaa
bbb
ccc

[1]------running------
starting thread Thread-3
ddd
aaa
bbb
ccc

[2]------running------
starting thread Thread-4
ddd
aaa
bbb
ccc

[3]------running------

starting thread Thread-5
ddd
aaa
bbb
ccc
[4]------running------
starting thread Thread-6
ddd

--main thread done--

 

posted @ 2018-11-19 20:59  Presley  阅读(661)  评论(0编辑  收藏  举报