threading模块创建多线程的两种手段

1.threading模块

  Python标准库提供两个模块用于实现多线程:thread和threading,thread是低级模块,threading是对thread的封装,是高级模块。绝大多数情况,我们仅使用threading模块

python标准库对使用threading创建多线程的解释:
在这里插入图片描述
  译文:Thread类表示在单独的控制线程中运行的活动。指定活动有两种方法:将可调用对象传递给构造函数,或重写子类中的run()方法。子类中不应重写任何其他方法(构造函数除外)。换句话说,只重写这个类的_init__;()和run()方法
  我们得到两种方式来创建多线程,第一种方式是把一个函数传入并创建Tread实例;第二种方式是直接从threading.thread继承并创建线程类,同时重写__init__方法和run方法

2.threading模块的构造函数

threading.Tread:

threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

调用这个构造函数时,必需带有关键字参数。参数如下:
group 应该为 None;为了日后扩展 ThreadGroup 类实现而保留。
target 是用于 run() 方法调用的可调用对象。默认是 None,表示不需要调用任何方法。
name 是线程名称。默认情况下,由 “Thread-N” 格式构成一个唯一的名称,其中 N 是小的十进制数。
args 是用于调用目标函数的参数元组。默认是 ()。
kwargs 是用于调用目标函数的关键字参数字典。默认是 {}。
如果不是 None,daemon 参数将显式地设置该线程是否为守护模式。 如果是 None (默认值),线程将继承当前线程的守护模式属性。
如果子类型重载了构造函数,它一定要确保在做任何事前,先发起调用基类构造器(Thread.init())。

  对于threading的构造函数中的参数,在最初学习中,我们仅用到target、name、args即可。

3.threading模块实现多线程的两种方法

前面已经提到有两种方法来使用threading实现多线程,下来依次给出实例

3.1传入函数并创建Thread实例
import threading
import random,time

#新线程执行函数
def thread_run(urls):
    print("current process is:",threading.current_thread().name)
    for url in urls:
        print(threading.current_thread().name,"--->",url)
        time.sleep(random.random())
    print(threading.current_thread().name,"ended")
#主线程打印
print("current process is:",threading.current_thread().name)

#创建threading实例对象thread1、thread2
thread1=threading.Thread(target=thread_run,name="thread1",args=(['url1','url2','url3'],))
thread2=threading.Thread(target=thread_run,name="thread2",args=(['url4','url5','url6'],))

#开始线程活动
thread1.start()
thread2.start()

thread1.join()
thread2.join()
print(threading.current_thread().name,"ended")

这里我们为构造方法中的target参数传入thread_run函数用作新线程的执行函数,分别为两个实例线程对象设置不同的name以及args参数元组

执行结果
在这里插入图片描述

3.2继承threading.Thread类,重写__init__和run方法

前面提到,通过继承threading.Thread类,我们只需重写__init__和run方法即可

3.2.1关于Thread类的__init__方法

下面是部分代码:
Thread类的具体实现见源码:源码

class Thread:
    """A class that represents a thread of control.
    This class can be safely subclassed in a limited fashion. There are two ways
    to specify the activity: by passing a callable object to the constructor, or
    by overriding the run() method in a subclass.
    """

    _initialized = False

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

实例

import threading,time,random

class myThreading(threading.Thread):
    def __init__(self,name,urls):
        threading.Thread.__init__(self,name=name)
        self.urls=urls

    def run(self):
        print("current ",threading.current_thread().name,"is runing")
        for url in self.urls:
            print(threading.current_thread().name,"---->>",url)
            time.sleep(random.random())
            print(threading.current_thread().name,"ended")

print("current",threading.current_thread().name,"is running")
thread1=myThreading(name="thread1",urls=['url1','url2','url3'])
thread2=myThreading(name="thread2",urls=['url4','url5','url6'])
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(threading.current_thread().name,"ended")

执行结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

涛涛ALG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值