Python中的线程

Posted ζ小菜鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的线程相关的知识,希望对你有一定的参考价值。

Python中的线程


一、前言

  如果需要同时处理多个任务,一种是可以在一个应用程序内使用多个进程,每个进程负责完成一部分工作;另外一种将工作细分为多个任务方法是使用一个进程内的多个线程。那么,什么是线程呢?

  线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务。例如对于视频播放器,显示视频用一个线程,播放音频用另外一个线程。只有2个线程同时工作,我们才能正常观看画面和声音同步的视频。

  举一个生活中的例子来更好的理解进程和线程的关系。一个进程就像一座房子,它是一个容器,有着相应的属性,如占地面积、卧室、厨房和卫生间等。房子本身并没有主动地做任何事情。而线程就是这座房子的居住者,他可以使用房子内每一个房间、做饭、洗澡等。


二、创建线程

  由于线程是操作系统直接支持的执行单位,因此,高级语言(如Python、Java等)通常都内置多线程的支持。Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。


1.使用threading模块创建线程成

  threading模块提供了一个Thread类来代表一个线程对象,语法如下:

Thread([group[,target [,name [,args [, kwargs]]]]])

  Thread类的参数说明如下:

  • group:值为None,为以后版本而保留。
  • target:表示一个可调用对象,线程启动时,run()方法将调用此对象,默认值为None,表示不调用任何内容。
  • name:表示当前线程名称,默认创建一个“Thread-N”格式的唯一名称。
  • args:表示传递给target()函数的参数元组。
  • kwargs:表示传递给target()函数的参数字典。

  对比发现,Thread类和Porcess类的方法基本相同,这里就不再赘述了。下面通过一个例子来学习一下如何使用threading模块创建线程。代码如下:

# encoding:utf-8
import threading
import time


def process():
    for i in range(3):
        time.sleep(1)
        print("thread name is %s" % threading.current_thread().name)


if __name__ == "__main__":
    print("----------主线程开始---------")
    threads = [threading.Thread(target=process) for i in range(4)]  # 创建4个线程,存入列表
    for t in threads:
        t.start()  # 开启线程
    for t in threads:
        t.join()  # 等待子线程结束
    print("------主线程结束-------------")

  上述代码中,创建了4个线程,然后分别用for循环执行次数start()和jion()方法。


2.使用Thread子类创建线程

  Thread线程类和Process进程类的使用方式非常相似,也可以通过定义一个子类,使其继承线程Thread线程类来创建线程。下面通过一个示例学习一下使用Thread子类创建线程的方式。

  创建一个子类SubThread,继承threading.Thread线程类,并定义一个run()方法。实例化SubThread类创建2个线程,并且调用start()方法开启线程,程序会自动调用run()方法。代码如下:

# encoding:utf-8

import threading
import time


class SubThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg = "子进程" + self.name + "执行,i=" + str(i)  # name属性中保存的是当前线程的名字
            print(msg)


if __name__ == "__main__":
    print("----------主线程开始---------")
    t1 = SubThread()
    t2 = SubThread()
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("------主线程结束-------------")

  运行结果如图所示:


三、线程间通信

  预知详情,请看下篇,关注 ζ小菜鸡,一起学习,咱们顶峰相见(๑•̀ㅂ•́)و✧


以上是关于Python中的线程的主要内容,如果未能解决你的问题,请参考以下文章

iOS多线程开发之GCD(下篇)

Python 面向对象-下篇

如何在 Python 上使用 Tweepy 创建 Twitter 线程

python数据分析基础008 -利用pandas带你玩转excel表格(中下篇)

flask基础(下篇)

在 XMPP 中的群聊 (MUC) 中解析居住者的真实 KID