1、Threading模块提供的类
Thread,Lock,Rlock,Condition,Semaphore,Event,Timer,local
2、threading模块提供的常用的方法
(1)threading.currentThread(): 返回当前的线程变量。
(2)threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
(3)threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
一、Thread 线程类
1、t1=threading.Thread(target=,name=,args=,kwargs=)
参数说明:
?group:线程组,目前还没有实现,库引用中提示必须是None;
?target:要执行的方法;
?name:线程名;
?args/kwargs:要传入方法的参数。
import threading
import time
def func1(a=None,b=None):
print a,b
time.sleep(1)
t1=threading.Thread(target=func1,args=(‘hello‘,‘world‘)) //这句话只是创建了一个线程,并未执行这个线程,此时线程处于新建状态。
t1.isAlive() 线程是否在运行
t1.getName 取线程名
t1.setName(‘test1‘) 设置线程名
t1.start() 启动线程,此时线程仍未处于运行状态,只是处于准备状态。
t1.join() 等待线程执行完
进程所在的线程是主线程
2、守护线程
t1.setDaemon(True)
主进程执行结束时,如果是守护线程,且守护线程没有执行结束,也一并随着主线程退出
# encoding=utf-8
import threading
import time
def func1(a=None, b=None):
print a,b
print ‘enter func1‘
time.sleep(5)
print ‘exit func1‘
t1 = threading.Thread(target=func1, args=(‘Hello ‘,‘World!‘))
print t1.isAlive()
print t1.getName()
t1.setDaemon(True)
print ‘daemon:‘,t1.isDaemon()
t1.setName(‘test1‘)
print t1.getName()
t1.start()
time.sleep(1.1)
print t1.isAlive()
print ‘main thread end‘
3、threading.currentThread() 主线程MainThread
二、多线程编程的方式
1、创建线程的两种方式
方式一:Thread的方式,新建一个线程实例,通过target传入执行流。通过args传入参数
方式二:Thread类通过重写的方式,t1.start()(内部调用了run())。所以可以重写run()方法,达到我们想要的效果
2、方式二:重写Thread类
import threading
class Mythread(threading.Thread):
def __init__(self,a):
threading.Thread.__init__(self):
self.a=a
def run(self):
print ‘now sleep‘,self.a,‘seconds‘
time.sleep(a)
print ‘sleep end‘
t1=MyThread(3)
t2=MyThread(2)
t1.start()
t2.start()
t1.join()
t2.join()
#隐含问题:对于线程的执行结果,主线程如何获取?
(1)通过队列的方式
(2)通过全局变量的方式
3、并发与并行
并发是指一个时间段内同时运行,表示的是一个区间
而并行是指在同一个时间点上都在运行,是一个点,并且并发在同一时间点上只能有一个程序在运行
并发线程的两种关系:同步与互斥。
三、线程池
from multiprocessing.dummy import Pool
def func(a):
time.sleep(1)
print a
if __name__==‘__main__‘:
lista=[1,2,‘a‘,‘b‘,‘5‘]
pool=Pool(5)
pool.map(func,lista)
pool.close() #线程池不接受新线程的请求
pool.join() #等待线程全部执行完