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