python的俩种创建线程的方式

        以前使用Qt的时候,使用过QT中QThread创建过线程,主要分为俩种方式:一种为子类化QThread,并重新实现run()函数;还一种为定义工作对象继承自 QObject,然后把这个工作对象move到QThread的一个对象中。

        然后现在看python时,发现python也有俩种创建线程的方式。Python 主要通过两种方式来创建线程:

  1. 使用 threading 模块的 Thread 类的构造器创建线程。
  2. 继承 threading 模块的 Thread 类创建线程类。

调用 Thread 类的构造器创建线程

         调用 Thread 类的构造器创建线程很简单,直接调用 threading.Thread 类的如下构造器创建线程:

__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)

         这个函数构造器涉及如下几个参数:

  • group:指定该线程所属的线程组。目前该参数还未实现,因此它只能设为 None。
  • target:指定该线程要调度的目标方法。
  • args:指定一个元组,以位置参数的形式为 target 指定的函数传入参数。元组的第一个元素传给 target 函数的第一个参数,元组的第二个元素传给 target 函数的第二个参数……依此类推。
  • kwargs:指定一个字典,以关键字参数的形式为 target 指定的函数传入参数。
  • daemon:指定所构建的线程是否为后代线程。

       通过 Thread 类的构造器创建井启动多线程的步骤如下:

  1. 调用 Thread 类的构造器创建线程对象。在创建线程对象时,target 参数指定的函数将作为线程执行体。
  2. 调用线程对象的 start() 方法启动该线程。

      示例代码如下:

import threading

def func(max):
    for i in range(max):
        print(threading.current_thread().getName() + "" + str(i))

for i in range(100):
    print(threading.current_thread().getName() + "" + str(i))
    if i == 15:
        t1 = threading.Thread(target = func, args=(100,))
        t1.start()
        t2 = threading.Thread(target = func, args=(100,))
        t2.start()
        t3 = threading.Thread(target = func, args=(100,))
        t3.start()

print('主线程执行完成!')

 

继承 Thread 类创建线程类

        通过继承 Thread 类来创建并启动线程的步骤如下:

  1. 定义 Thread 类的子类,并重写该类的 run() 方法。run() 方法的方法体就代表了线程需要完成的任务,因此把 run() 方法称为线程执行体。
  2. 创建 Thread 子类的实例,即创建线程对象。
  3. 调用线程对象的 start() 方法来启动线程。

       示例代码如下:

import threading

class FkThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.i = 0

    def run(self):
        while( self.i < 100):
            print(threading.current_thread().getName() + "" + str(self.i))
            self.i += 1

for i in range(100):
    print(threading.current_thread().getName() + "" + str(i))
    if i == 15:
        fk1 = FkThread()
        fk1.start()
        fk1 = FkThread()
        fk1.start()

print('主线程执行完成!')

         通常来说,推荐使用第一种方式来创建线程,因为这种方式不仅编程简单,而且线程直接包装 target 函数,具有更清晰的逻辑结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值