栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python threading 1

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python threading 1

系列文章目录

文章目录
  • 系列文章目录
  • 多线程
  • python实现多线程
  • 使用demo
    • demo1 : 创建一个子线程并启动
    • demo2: 创建多个子线程并运行
    • demo3: 重写类
  • 总结


多线程

多线程开发是提高cpu效率的一种操作,属于并发的一种,这里要分清并发和并行的概念,它们是完全不同的,所谓并行指的是,对一个多核的cpu而言,在多个核心上同时去运行多个任务,这个叫做并行,并行要实现的代价是比较高的,所谓并发指的是对于一个cpu而言,将时间分成一段一段的,其中的每一段时间称为时间片,让多个任务在每一次时间片上去交叉运行。


python实现多线程

很多文章都会说,python本身提供了一个很低级的多线程的调用库,那个库的名字叫做_thread,这个库提供的功能非常简单,做一些比较高等的开发的时候,只用这些简单的功能是完全不够的,我们更推荐使用threading,学习库其实并不是一件难事,只要记住关键的对象,操作,坑等就可以了。

比如对于threading库来说,其实最重要的无非就是一个threaing.Thread()对象,其次就是一个threading.Lock()锁机制

使用demo

从简单的开始,理解python的主线程,学习过C语言的,大家都知道一个.c文件中,main是整个代码的入口。在python中,main就是主线程,属于任务的开始,任何其他的线程都是去基于主线程去创建的。如果主线程凋亡,那么其他线程理应凋亡。

demo1 : 创建一个子线程并启动

这里其实就是创建一个子线程去执行一个循环输出的任务,创建子线程的过程,其实就是实例化这个Thread对象,start方法即开始执行子线程,对join方法如果疑惑的话,可以注释掉这行代码,试一试就会发现,可能不会有任何的输出,或者输出一个child thread: 就停止了,这是因为主线程结束了。还记得上面说的话吗,主线程结束,其他线程理应凋亡。当我们使用join方法后,会对当前线程进行阻塞,也就是主线程会被阻塞,一直等待子线程结束,因此才可以顺利的运行。

import threading
import time


def print_demo():
    for i in range(5):
        # print(threading.currentThread().name, i)
        print('child thread: ', i)
        time.sleep(1)


if __name__ == '__main__':
    # target传入的是一个必要的参数,这个参数代表回调的方法 在构造时加入name属性可以为线程赋值 当daemon属性为True时,主线程结束时,其他线程也
    # 会一起结束。
    thread = threading.Thread(target=print_demo, name='test_thread', daemon=True)
    thread.start()
    thread.join()
demo2: 创建多个子线程并运行

这里做的仅仅是打印任务,但是试想一下如果我们要做很大量的运算,仅仅去单线程的运行,效率就会很低下,这也就是开始说的,可以提高cpu的效率。同时多次观察这段代码的运行结果,还会发现多线程的运行是无序的,实际上,它是有规则的,主要与系统的调度算法,但是就不多说。

import threading
import time


def print_demo(flag=None):
    """

    :param flag:
    :return:
    """
    for i in range(5):
        # print(threading.currentThread().name, i)
        print(flag + 'child thread: ', i)
        time.sleep(1)


if __name__ == '__main__':
    # target传入的是一个必要的参数,这个参数代表回调的方法 在构造时加入name属性可以为线程赋值 当daemon属性为True时,主线程结束时,其他线程也
    # 会一起结束。
    thread1 = threading.Thread(target=print_demo, args=["ch1"], name='test_thread', daemon=True)
    thread2 = threading.Thread(target=print_demo, args=["ch2"], name='test_thread', daemon=True)
    thread3 = threading.Thread(target=print_demo, args=["ch3"], name='test_thread', daemon=True)
    thread1.start()
    thread2.start()
    thread3.start()
    
    thread1.join()
    thread2.join()
    thread3.join()
demo3: 重写类

很多时候我们要用面向对象的风格去编写,

import threading


class my_thread_class(threading.Thread):
    def __init__(self, name=None):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        print('name: ', self.name)

my_thread = my_thread_class(name='baby')
my_thread.start()

总结

这里主要是写一点对于threading使用的demo用来自己写的时候方便的,这些demo可以逐渐完善起来的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号