Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >进程、线程、协程介绍

进程、线程、协程介绍

作者头像
搁浅同学
发布于 2022-12-14 06:25:01
发布于 2022-12-14 06:25:01
34100
代码可运行
举报
运行总次数:0
代码可运行

学习python,我们肯定绕不过进程、线程、协程的学习,今天我们就简单的学习了解。首先我们了解下它们的基本概念。

进程:进程是操作系统最小调度单元,是系统资源分配的最小单元,进程间资源独享

线程:线程是CPU的最小调度单元,不参与系统资源分配,一般共享进程的资源

协程:既不是进程,也不是线程,由程序进行调度

我们在使用它们的时候,主要用于一些并发的实现,比如我们日常生活中,我们听音乐和wa游戏可以同时进行,这个时候,我们就需要进行并发编程了。所以现在就进程、线程、协程三种实现的方式进行简单实现

进程

进程在python里面的可通过第三方库进行实现,定义两个函数,分别是work1、work2代表听音乐和玩游戏,并统计程序运行的时间,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
from multiprocessing import Process


def work1():
    for i in range(5):
        print("work1: play music~")
        time.sleep(1)


def work2():
    for i in range(5):
        print("work1: play lol~")
        time.sleep(1)

if __name__ == "__main__":
    start = time.time()
    work1()
    work2()
    end = time.time()
    print("共消耗{:.2f}秒".format((end-start)))
    

以上未使用进程实现时,运行结果如下,先执行玩听音乐,才能玩游戏,共消耗10s

通过进程进行实现并发,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
from multiprocessing import Process


def work1():
    for i in range(5):
        print("work1: play music~")
        time.sleep(1)


def work2():
    for i in range(5):
        print("work1: play lol~")
        time.sleep(1)


if __name__ == "__main__":
    start = time.time()
    p1 = Process(target=work1)  # 创建一个进程对象
    p2 = Process(target=work2)
    p1.start()  # 启动进程
    p2.start()
    p1.join()  # 阻塞主进程,不然会导致
    p2.join()
    end = time.time()
    print("共消耗{:.2f}秒".format((end-start)))

运行结果如下,听音乐和玩游戏可以同时进行,执行时间是5s

线程

我们还是通过以上的示例代码,通过线程进行实现,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import threading


def work1():
    for i in range(5):
        print("work1: play music~")
        time.sleep(1)


def work2():
    for i in range(5):
        print("work1: play lol~")
        time.sleep(1)


if __name__ == "__main__":
    start = time.time()
    t1 = threading.Thread(target=work1)  # 创建一个线程
    t2 = threading.Thread(target=work2)
    t1.start()  # 启动线程
    t2.start()
    t1.join()  # 阻塞主线程
    t2.join()
    end = time.time()
    print("共消耗{:.2f}秒".format((end - start)))

执行效果和多进程是一样的效果

协程

协程主要是分别可以通过两个库进行实现,分别是gevent和asyncio进行实现,还是以上的示例代码,通过协程实现

gevent进行实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import gevent


def work1():
    for i in range(5):
        print("work1: play music~")
        gevent.sleep(1)


def work2():
    for i in range(5):
        print("work1: play lol~")
        gevent.sleep(1)


if __name__ == "__main__":
    start = time.time()
    g1 = gevent.spawn(work1)
    g2 = gevent.spawn(work2)
    g1.join()
    g2.join()
    end = time.time()
    print("共消耗{:.2f}秒".format((end - start)))

程序执行效果还是一样的

asyncio进行实现

asyncio实现需要使用到两个关键词aysnc await,其中async是用来声明函数式一个协程,await是等待一个函数的,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import asyncio


async def work1():
    for i in range(5):
        print("work1: play music~")
        await asyncio.sleep(1)


async def work2():
    for i in range(5):
        print("work1: play lol~")
        await asyncio.sleep(1)


async def main():
    task1 = asyncio.create_task(work1())
    task2 = asyncio.create_task(work2())
    await task1
    await task2


if __name__ == "__main__":
    start = time.time()
    asyncio.run(main())
    end = time.time()
    print("共消耗{:.2f}秒".format((end - start)))

执行效果还是一样的哦

以上进程、线程、协程都可以进行实现并发,这个需要根据我们自己所需选择不同的实现,以上也是一个简单的介绍实现,更多的实现和用法需要去了解学习,点个关注,欢迎一起学习。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 暴走的软件测试Tester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
concurrent.futures模块(进程池/线程池)
本节主题是实现单线程下的并发,即只在一个主线程,并且很明显的是,可利用的cpu只有一个情况下实现并发,
全栈程序员站长
2022/07/21
1.5K0
concurrent.futures模块(进程池/线程池)
​Python协程
协程是 python 中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带 CPU 上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU 上下文那么程序还是可以运行的。
忆想不到的晖
2021/04/04
6020
​Python协程
多任务中进程、线程、协程
并行:任务数大于CPU核数,每个CPU就要执行多个任务,那肯定忙不过来,多个任务执行就需要排队等待上一任务执行完,才能执行下一任务。
py3study
2020/01/19
3940
Python并发:线程、进程、协程的抓取速度
用一段代码测试线程、进程、协程的抓取速度: # -*- coding: utf-8 -*- import time import asyncio import aiohttp import requests import threading import multiprocessing from multiprocessing import Process from multiprocessing.dummy import Pool as ThreadPool OPTION = { "CORO
SeanCheney
2020/10/29
9370
Python并发:线程、进程、协程的抓取速度
测试开发进阶(十)
进程之间通信 进程之间通信:使用队列 queue模块中的队列,只能用于一个进程中,各个线程之间进行通信 进程模块中的Queue:可以用于多个进程之间进行通信 ⚠️注意点:使用的时候要使用参数传递到各个进程任务中 from multiprocessing import Queue from multiprocessing import Process, Queue q = Queue() for i in range(5): q.put(i) def work1(q): while
zx钟
2019/08/29
3920
Python基础|一文讲透 Python 协程
在类里面提供一个__iter__创建的对象是可迭代对象,可迭代对象是需要迭代器完成数据迭代的
陈晨135
2022/01/10
4920
Python 异步协程:从 async/await 到 asyncio 再到 async with
在 Python 3.8 以后的版本中,异步编程变得越来越重要。本文将系统介绍 Python 标准库中的异步编程工具,带领大家掌握 async/await 语法和 asyncio 的使用。
Piper破壳
2024/12/23
2740
python协程回顾
自动切换 from gevent import monkey; monkey.patch_all()
小闫同学啊
2019/07/18
4670
Python多任务教程:进程、线程、协程
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志。
Python学习者
2023/08/08
3140
Python之协程
前言         在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。 为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务
新人小试
2018/04/12
6670
Python之协程
python 实现协程 提高效率
协程的概念: 其实在操作系统中并没有协程的概念,协程的出现为的是解决单线程后者单进程下实现并发的效果。使用方式:操作系统无法感知单线程中的协程之间的切换。
全栈程序员站长
2022/07/08
3940
多任务—协程
协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。
py3study
2020/01/16
4070
python多任务—协程(一)
写在前面: 花了一周的时间,对协程做了一个简单的梳理,特别是异步编程asyncio库的使用,做了详细的说明。本文主要包括的知识点有:yield生成器的复习并实现协程的功能、greenlet库实现协程、gevent库实现协程、asyncio异步协程的介绍、异步协程的创建与运行、任务的创建与运行、并发运行gather/wait/as_complete/wait_for等方法的实现、异步协程的嵌套、await关键字的理解等等,这些都是基础。由于篇幅比较长,打算分为两篇,第二篇在介绍一下asyncio的其他用法。
全栈程序员站长
2022/09/14
1.6K0
Python进程/线程/协程
程序员无法把所有的硬件操作细节全部了解到,管理这些硬件并且加以优化使用时非常繁琐的工作,这个繁琐的工作就是由操作系统来干的,有了它,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件
py3study
2020/01/07
6380
Python进程/线程/协程相关
(2)、系统全局标识:python下使用ctypes获取threading线程id。
py3study
2020/01/06
3550
5.并发编程协程
  本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态
changxin7
2019/09/10
4560
Python3的原生协程(Async/Await)和Tornado异步非阻塞
    我们知道在程序在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞,而协程作为一种用户态的轻量级线程,可以帮我们解决这个问题。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存,在调度回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,即所有局部状态的一个特定组合
用户9127725
2022/08/08
7420
Python3的原生协程(Async/Await)和Tornado异步非阻塞
协程学习笔记
协程是轻量级线程,拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,即所有局部状态的一个特定组合,每次过程重入时,就相当于进入上一次调用的状态。
somenzz
2020/12/10
6460
协程学习笔记
进程队列补充、socket实现服务器并发、线程完结
解释型语言单个进程下多个线程不可以并行,但是向C语言等其他语言中在多核情况下是可以实现并行的,所有语言在单核下都是无法实现并行的,只能并发。
GH
2019/12/16
6030
进程队列补充、socket实现服务器并发、线程完结
python3--协程,greenlet模块,gevent模块
之前学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。
py3study
2018/08/02
2.9K0
相关推荐
concurrent.futures模块(进程池/线程池)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验