python多线程(1):Threading模块

作者: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
发布了39 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_31315135/article/details/89205786