python 之多线程编程(二)

Threading模块

python中的多线程主要有两个模块,thread模块和threading模块,相比较thread而言threading模块对线程支持更完善,有更多的同步原语,thread更底层,threading更加常用。所以着重介绍threading模块。

Thread类

Thread类属性:

属性描述
name线程名
ident线程标识符
daemon布尔值,表示这个线程是否守护线程

Thread类方法

函数描述
__init__(group=None, target=None,name=None,args=(),kwargs={},verbose=None,daemon=None实例化一个线程对象,需要一个可调用的target对象,以及参数args或者kwargs。还可以传递name和group参数。daemon的值将会设定thread.daemon的属性.
start()开始线程的执行
run()定义线程的功能的函数(一般会被子类重写)
join( t i m e o u t \mathit{timeout } timeout= None)程序挂起,知道线程结束;如果给了timeout,则最多阻塞timeout秒
getName()返回线程的名字
setName()设置线程的名字
isAlive()布尔标志,表示这个线程是否还在运行中
isDaemon()返回线程的daemon标志
setDaemon( d a e m o n i c \mathit{daemonic} daemonic)把线程的daemon标志设为daemonic(一定要在调用start()函数前调用)

创建线程的三种方式

1)创建一个Thread的实例,传给它一个函数:

import time
import threading


def func(n):
    while n > 0:
        print("线程name:", threading.current_thread().name, "参数n:", n)
        n -= 1
        time.sleep(1)

# 实例化一个Thread对象,传递函数和参数
t = threading.Thread(target=func, args=(5,))
t.start()
print("主线程:", threading.current_thread().name)

2)创建一个Thread的实例,传给它一个可调用的类对象

import time
import threading


class myThreadfunc(object):
    def __init__(self, func, args, name=''):
        self.name = name
        self.func = func
        self.args = args
	# 调用self.func的同时传入self.args
    def __call__(self):
        self.func(*self.args)

def loop(n):
    while n>0:
        print('线程name:', threading.current_thread().name, '参数:', n)
        n -= 1
        time.sleep(1)
# 实例化Thread对象的同时,调用了传入的func函数(就是loop),
#又使用传入的参数args((5,))当作func函数的参数
t = threading.Thread(target=myThreadfunc(loop, (5, ), loop.__name__))
t.start()
print('主线程:',threading.current_thread().name)

3)从Thread派生出一个子类,创建一个这个子类的实例(常用)

import time
import threading


class myThreadfunc(threading.Thread):
	# 子类构造函数必须先调用父类的构造函数
    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args
	# 重写run()方法代替__call__()方法
    def run(self):
        self.func(*self.args)

def loop(n):
    while n>0:
        print('线程name:',threading.current_thread().name, '参数:',n)
        n -= 1
        time.sleep(1)

t = myThreadfunc(loop, (5,), loop.__name__)
t.start()
print('主线程:',threading.current_thread().name)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值