Python创建多线程的三种方法

  • thread模块函数式创建线程
  • 继承threading类创建多线程
  • threading模块函数式创建线程
  • 使用总结


thread模块函数式创建线程

调用thread模块中的start_new_thread()函数来产生新线程。语法如下:
thread.start_new_thread ( function, args[, kwargs] )
参数说明:

  • function - 线程函数。
  • args - 传递给线程函数的参数,他必须是个tuple类型。
  • kwargs - 可选参数。

一言不合上代码:

#-*- coding:utf-8 -*-
import thread
import time
def A(para):
    for i in range(5):
        print para
        time.sleep(0.5)

def B(para):
    for i in range(5):
        print para
        time.sleep(0.2)

if __name__ == '__main__':
    thread.start_new_thread(A, ('我是线程A',))
    thread.start_new_thread(B, ('我是线程B',))
    while 1:
        pass

结果如下:

python 子线程传递至给主线程 python创建子线程_Python


PS:我们可以看到,B线程先执行完了,因为我们设置了睡眠时间为0.2秒,A线程等待时间为0.5秒,虽然先运行的A线程,但是在等待的同时会自动切换到B线程,充分利用了CPU的等待时间,关于多线程,一般在IO密集型的场合使用比较多,比如运行爬虫的时候,关于多线程、多进程、多协程的适用场合,后面我会新建一个文章深入研究。

继承threading类创建多线程

继承线程类threading.thread,再重载成员函数run,程序处理的代码写在函数run中,最后再调用start()方法来运行线程
代码如下:

#-*- coding:utf-8 -*-
import threading
import time
'''
获得当前线程的名称
threading.current_thread().getName()
threading.current_thread().name
'''
class A(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        for i in range(5):
            print '我是线程A',threading.current_thread().getName()
            time.sleep(0.5)

class B(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        for i in range(5):
            print '我是线程B',threading.current_thread().name
            time.sleep(0.2)
t1=A()
t1.start()
t2=B()
t2.start()

结果如下:

python 子线程传递至给主线程 python创建子线程_threading_02

threading模块函数式创建线程

创建线程时,传入一个函数,用于线程执行,比起通过类继承创建多线程,函数式创建线程有更好的灵活性。
代码如下:

#encoding:utf-8
import threading
import time
import random

def run(sec):
    time.sleep(sec)
    print'当前线程的名字是: ', threading.current_thread().name

if __name__ == '__main__':
    print'这是主线程:', threading.current_thread().name
    thread_list = []
    '''创建多个线程'''
    for i in range(5):
        t = threading.Thread(target=run,args=(random.random(),))
        thread_list.append(t)
    #循环这5个线程,调用相应的run方法
    for t in thread_list:
        t.start()

结果如下:

python 子线程传递至给主线程 python创建子线程_多线程_03

使用总结

关于threading和thread的使用总结:
	threading 模块介绍:
    	1.threading 是对thread模块的再封装
    	2.threading 模块支持守护线程
   		3.threading.Thread(target,args)  创建线程,但没有启动线程
   		4..start()   开启线程
   		5..join()     挂起线程
   		6.当主线程执行完退出时,默认重要的子线程完成后再退出
  	 在thread模块中
   		1.thread.start_new_thread()方法不仅创建了线程而且启动了线程
		2.当主线程执行完退出时,其他的线程都会无警告,无保存的死亡