作者:IT小样
好记性不如烂笔头,对这句话深有感触,最近学习的一些东西由于没有马上用到,过一段时间后又忘记了,所以立个Flag,以后学习的东西,需要记忆的东西比较多时,写篇博客记录一下,就当是学习指引了。
Python多线程,看教程时有两个类Thread和Threading,Threading模块是在Thread模块的基础上进行封装的,使用更高级,因此本篇记录Threading模块的学习。
多线程编程总体概述
使用多线程编程,编程任务可以规划成几个执行特定函数的线程:
UserRequestThread:负责读取客户端输入,程序将创建多个线程,每个客户端一个,请求会放在队列中
RequestProcessor:从队列中获取请求并进行处理,为第3个线程提供输出
ReplyThread:负责向用户输出,将结果传回给用户
Threading模块
1、Thread类
1.1 基础介绍
属性 | 描述 |
---|---|
Thread对象数据属 | |
name | 线程名 |
ident | 线程的标识符 |
daemon | 布尔标志,表示这个线程是否是守护进程 |
Thread 对象方法 | |
_init_(group=None,target=None,name=None,args=(),kwargs={},verbose=None,daemon=None | 实例化一个线程对象,需要一个可调用的target,以及其参数args或者kwargs. |
start() | 开始执行该线程 |
run() | 定义线程功能的方法 |
join(timeout=None) | 直至启动的线程终止之前一直挂起,除非给出了timeout,否则会一直阻塞 |
使用Thread类,可以有很多方法创建线程,简要列出3种:
1、创建Thread的实例,传给它一个函数
2、创建Thread的实例,传给它一个可调用的类实例
3、派生Thread的子类,并创建子类的实例
第一种和第三种方法使用较多,此处只介绍第三种。
1.2 创建线程(派生Thread子类,并创建子类的实例)
直接上代码:
import threading
from time import sleep,ctime
loops=(4,2)
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
def run(self):
self.func(*self.args)
def loop(nloop,nsec):
print('start loop',nloop,'at',ctime())
sleep(nsec)
print('loop',nloop,'done at:',ctime())
def main():
print('starting at:',ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = MyThread(loop,(i,loops[i]),loop.__name__)
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print('all done at:',ctime())
if __name__ == '__main__':
main()
运行结果见下图:
1.3 threading模块的其它函数
函数 | 描述 |
---|---|
active_count() | 当前活动的thread对象个数 |
current_thread | 返回当前的Thread对象 |
enumerate() | 返回当前活动的Thread对象列表 |
settrace(func) | 为所有线程设置一个trace函数 |
setprofile(func) | 为所有线程设置一个profile函数 |
stack_size(size=0) | 返回新创建线程的栈大小;或为后续创建的线程设定栈的大小为size |