python threading 1

本文介绍了Python中多线程的概念,包括并发与并行的区别,并展示了如何使用`threading`库创建和管理线程。通过三个示例代码,演示了如何创建单线程、多个线程以及自定义线程类。强调了主线程与子线程的关系,以及`join`方法的作用。最后,总结了多线程在提高CPU效率中的应用。
摘要由CSDN通过智能技术生成

系列文章目录



多线程

多线程开发是提高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可以逐渐完善起来的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值