IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 线程、进程、协程简单理解及其在python中的实现 -> 正文阅读

[Python知识库]线程、进程、协程简单理解及其在python中的实现

声明:这部分好像是计算机系统里的内容,本人并未正式学过相关内容,以下内容均为学习python爬虫时所了解,算是学习笔记,有错误请大家及时指出!

对于三者的理解

基本概念

(参考自简书
进程是应用程序的启动实例,进程拥有代码和打开的文件资源、数据资源、独立的内存空间。

线程是程序的实际执行者,一个进程至少包含一个主线程,也可以有更多的子线程,线程拥有自己的栈空间。

首先要明确的是进程(process)是一个资源单位,而线程(thread)是一个执行单位。**协程(coroutines)**是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。总结:协程从属于线程,线程从属于进程。
在这里插入图片描述

工作原理分析

对操作系统而言,线程是最小的执行单元,进程是最小的资源管理单元。无论是进程还是线程,都是由操作系统所管理的。

协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。协程不是进程也不是线程,而是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。

程序开始运行后,会创建一个或多个进程(一般是一个),在进程又会在进程中创建一个或多个线程(一般也是一个)。
线程具有五种状态:初始化、可运行、运行中、阻塞、销毁
在这里插入图片描述
假如不引入协程,线程在进行时会遇到许多阻塞(多为IO操作),遇到阻塞时线程无法“前进”,有时候这些等待是没有意义的(比如爬虫爬取资源时需要与网站服务器进行会话,这个过程是很耗时间的,这段时间完全可以进行其他操作),为了减少无意义的等待,程序员在编写代码时可以将一些函数协程化(自己编的词汇),当一个协程(即已被协程化的函数)进入等待时,计算机就会跳出这个协程,将这个函数“挂起”,去执行另外一个协程。计算机会在多个协程之间反复切换,减少等待时间,提高程序运行效率。

python实现

多进程

多进程python实现:

from multiprocessing import Process

def func():#测试函数
    for i in range(1000):
        print('func',i)
if __name__=='__main__':
    p=Process(target=func)#新建进程
    p.start()#启动新进程
    for i in range(1000):#“主进程”
        print('main',i)

代码分析
首先导入相关的库

from multiprocessing import Process

新建一个进程,并让函数func()在该进程中执行

	p=Process(target=func)#新建进程
    p.start()#启动新进程

测试结果部分截图
两个进程交叉杂乱执行(不受程序员控制
在这里插入图片描述

多线程

多线程python实现:

from threading import Thread

def func():#测试函数
    for i in range(100):
        print('func',i)
if __name__=='__main__':
    t=Thread(target=func)#新建线程
    t.start()#启动新线程
    for i in range(100):#“主线程”
        print('main',i)

代码分析
导入相关库

from threading import Thread

新建一个线程,并让函数func()在该线程中执行

	t=Thread(target=func)#新建线程
    t.start()#启动新线程

测试结果部分截图
两个线程交叉杂乱执行(不受程序员控制
在这里插入图片描述

多协程

多协程程python实现:
(代码有注释就不分析了)

import asyncio#实现协程所需的库
import time#测试程序运行时间用
async def func1():#协程1
    print('我是C++')
    #通过睡眠函数模拟函数将线程阻塞
    #运行到这时将函数挂起去执行其他函数
    await asyncio.sleep(4)
    print('我是C++')

async def func2():#协程2
    print('我是java')
    #通过睡眠函数模拟函数将线程阻塞
    #运行到这时将函数挂起去执行其他函数
    await asyncio.sleep(3)
    print('我是java')

async def func3():#协程3
    print('我是python')
    #通过睡眠函数模拟函数将线程阻塞
    #运行到这时将函数挂起去执行其他函数
    await asyncio.sleep(3)
    print('我是python')

async def main():
	'''新建三个协程任务'''
    f1=func1()
    f2=func2()
    f3=func3()
    tasks=[
        f1,f2,f3
    ]
    await asyncio.wait(tasks)#将三个任务交给main()函数

if __name__=='__main__':
    t1=time.time()#计时
    asyncio.run(main())#启动协程
    t2=time.time()#计时
    print(t2-t1)#打印运行时间

程序运行结果:
在这里插入图片描述
程序运行只用了4点多秒,如果不采用协程,三个函数睡眠时间总和为10秒,程序运行时间将超过10秒,所以协程极大的提高了程序执行的效率。

补充(线程池和进程池)

python实现(以线程池为例,进程池同理)

#导入相关库,ThreadPoolExecutor为线程池,ProcessPoolExecutor为进程池
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def func(name):#测试函数
    for i in range(100):
        print(name,i)
if __name__=='__main__':
    with ThreadPoolExecutor(20) as TP:#创建一个有20个线程的线程池
        for i in range(20):
        	#将func()函数交给线程池中的线程
            TP.submit(func,name=f"线程{i}")
    print('over')

运行结果部分截图
多个线程交叉杂乱执行(不受程序员控制
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:48:38  更:2021-10-01 16:50:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:44:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码