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
结果如下:
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()
结果如下:
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()
结果如下:
使用总结
关于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.当主线程执行完退出时,其他的线程都会无警告,无保存的死亡