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()

猜你喜欢

转载自blog.csdn.net/paul0926/article/details/89213556