python的多线程机制与使用
进程和线程
一、进程
进程是程序的分配资源的最小单元;一个程序可以有多个进程,但只有一个主进程;进程由程序、数据集、控制器三部分组成。
二、线程
线程是程序最小的执行单元;一个进程可以有多个线程,但是只有一个主线程;线程切换分为两种:一种是I/O切换,一种是时间切换(I/O切换:一旦运行I/O任务时便进行线程切换,CPU开始执行其他线程;时间切换:一旦到了一定时间,线程也进行切换,CPU开始执行其他线程)。
三、总结
一个程序至少有一个进程和一个线程;
程序的工作方式:
1.单进程单线程;2.单进程多线程;3.多进程多线程;
考虑到实现的复杂性,一般最多只会采用单进程多线程的工作方式;
四、为什么要使用多线程
我们在实际生活中,希望既能一边浏览网页,一边听歌,一边打游戏。这时,如果只开一个进程,为了满足需求,CPU只能快速切换进程,但是在切换进程时会造成大量资源浪费。所以,如果是多核CPU,可以在同时运行多个进程而不用进行进程之间的切换。
然而,在实际中,比如:你在玩游戏的时候,电脑需要一边显示游戏的动态,一边你还得和同伴进行语音或语言进行沟通。这时,如果是单线程的工作方式,将会造成在操作游戏的时候就无法给同伴沟通,在和同伴沟通的时候就无法操作游戏。为了解决该问题,我们可以开启多线程来共享游戏资源,同时进行游戏操作和沟通。
五、并发和并行
并发:在一个时间段,处理多个任务,单核也可以并发(CPU分时间片);
并行:在同一个时刻,处理多个任务,必须多核才能并行;
Python实现并发的手段:1、操作系统提供:进程、线程;2、编程语言提供:协程:用户空间的调度(py3);题外话:现在的操作系统,进程和线程的区别越来越小,因为进程越来越轻了;实际上,Linux的线程是通过进程实现的;
六、Python的进程和线程的区别
Python每个进程都会启动一个解释器;Python每个线程(一个进程下面的)共享一个解释器;ps:Python没有提供主动停止线程的方法的;只能等线程处理完毕,或者主线程结束;所以在线程逻辑里面一定要写退出逻辑。
七、实例实现多线程
'''多线程的引入需要导入包'''
import threading
import time
class Person(object):
def __init__(self, name):
self.name = name
def type_codes(self):
for i in range(5):
print('%s在敲代码'%self.name)
time.sleep(0.01)
def smoke(self):
for i in range(5):
print('%s在抽烟'%self.name)
time.sleep(0.01)
# 线程的执行是无序的
if __name__ == '__main__':
xiaoMing = Person('小明')
coding_thread = threading.Thread(target=xiaoMing.type_codes) #创建线程
smoking_thread = threading.Thread(target=xiaoMing.smoke)
print(threading.active_count()) # 活动线程的个数
smoking_thread.setDaemon(True) # 设置成主线程结束则销毁,守护线程
coding_thread.setDaemon(True) # 有几个线程都要守护
coding_thread.start() #开始线程
smoking_thread.start()
print(threading.enumerate()) # 函数显示的是活动的线程数
print('主线程结束')
exit()
八、自定义的方式来产生线程
import threading
class MyThread(threading.Thread):
def __init__(self, num):
super(MyThread, self).__init__() # 一定要调用父类初始化
# threading.Thread.__init__(self) # 这种方法也可以
self.num = num
def run(self):
# 这里自定义线程运行时的函数
print('此时调用')
if __name__ == '__main__':
thread = MyThread(1)
thread.start()