关于Python的进程线程协程之threading模块(一)Thread类

本文详细介绍了Python的`threading`模块,重点讲解了`Thread`类的使用,包括创建线程的三种方式、start()、run()、join()、setDaemon()等方法的原理与应用。通过多个实例展示了线程的启动、守护线程的设置以及线程同步。
摘要由CSDN通过智能技术生成

threading模块所有的对象:


  1. Thread:表示一个线程的执行对象 Lock :锁源于对象 RLock:可重入锁对象,使单个线程可以再次获得已经获得的锁(递归锁定)

  2. Condition:条件变量能够让一个线程停下来,等待其他线程满足了某个条件。如状态改变 满足了某个值或者状态

  3. Event:通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活

  4. Semaphore:为等待锁的线程提供一个类似等候室的结构

  5. BoundedSemaphore:与Semaphore类似,只是它不允许超过初始值

  6. Timer:与Thread相似,只是它要等待一段时间后才开始运行


Thread类:

其中threading的Thread类对象是主要的多线程运行对象,用Thread类你可以用多种方法创建对象,这里主要介绍三种:


方法一.创建一个Thread的实例,传给它一个函数;
方法二.创建一个Thread的实例,传给它一个可调用的类对象;
方法三.从Thread派生出一个子类,创建一个这个子类的实例。

Thread类的方法:

  1. start(): 开始线程的执行
  2. run():定义线程的功能函数,当应用上面介绍的方法三时才会用到(子类重写父类的run方法)
  3. join(timeout = None):程序挂起,直到线程结束;如果给了timeout,则最多阻塞timeout秒
  4. getName():返回线程的名字
  5. setName(name):设置线程的名字
  6. isAlive():布尔标志,表示这个线程是否还在运行中
  7. isDaemon():返回线程的Daemon标志
  8. setDaemon(True or False): True:线程被设置为守护线程;False:主线程会被挂起

关于start()方法源码如下:

关于start()方法开始线程的执行,在源码里其实是运行的是run方法

class Thread(_Verbose):
......省略多处......

    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None):

       ......省略多处......

        if kwargs is None:
            kwargs = {}
        self.__target = target
        self.__name = str(name or _newname())
        self.__args = args
        self.__kwargs = kwargs
        self.__daemonic = self._set_daemon()
        ......省略多处......

    def start(self):
    ......省略多处......
                try:
                    _start_new_thread(self.__bootstrap, ())
                except Exception:
                    with _active_limbo_lock:
                        del _limbo[self]
                    raise
                self.__started.wait()

    def __bootstrap(self):
        try:
                self.__bootstrap_inner()
            except:
                if self.__daemonic and _sys is None:
                    return
                raise
      def __bootstrap_inner(self):
            try:
                ......省略多处......
                try:
                    self.run()
    ......省略多处......

    def run(self):

        try:
            if self.__target:
                self.__target(*self.__args, **self.__kwargs)
        finally:
            del self.__target, self.__args, self.__kwargs

实例一:

方法一.创建一个Thread的实例,传给它一个函数

# _*_coding:utf-8_*_
import threading
from time import sleep,ctime

"""
the process that intruduce class of thread 
"""

_time = [2,4,6,8]
# Thread hang time 线程挂起的时间
_maxlink = len(_time)
# A pool of thread max-link 线程池的最大的数量
_thread_pool = []
# A pool of thread that save instantiation threads   存放线程实例的线程池


def loop(index,time):
    """ A function to class Thread for sleep some times """
    print "start loop %s at: "%index,ctime()
    sleep(time[index])
    print "end loop %s at: "%index,ctime()

def Thread_Pool(*arg):
    """ A function that create and save instantiation
     of threading to thread pool """
    func,LN,Time = arg
    for i in range(LN):
            t = threading.Thread(target = func,args = (i,Time))
            _thread_pool.append(t)
            # 将线程实例放到线程池

def Thread_Start(arg):
    """ A function that represents a thread of control. """
    for i in range(arg):
        _thread_pool[i].start()


def main():
    """A function of main"""
    print "process start at: ".upper(),ctime()
    Thread_Pool(loop,_maxlink,_time)
    Thread_Start(_maxlink)
    print "process end at: ".upper(),ctime()

if __name__ == '__main__':
main()<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaysenLeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值