Python多任务教程:进程、线程、协程

Python进程、线程、协程 每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。这种任务虽然也可以用多任务完成,但是当任务过多时(超过cpu的核数),花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。:涉及到网络、磁盘IO的任务都是IO密集型任务,比如网络传输、数据库等调用、爬虫等,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(存在阻塞),99%的时间花费在IO上(因为IO的速度远远低于CPU和内存的速度)。 阅读详情

1.进程

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志。

进程具有的特征:

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的。
  • 并发性:任何进程都可以同其他进程一起并发执行。
  • 独立性:进程是系统进行资源分配和调度的一个独立单位。
  • 结构性:进程由程序、数据和进程控制块三部分组成。
实现多进程
import multiprocessing
import time


def run1(sleep_time):
    while True:
        print("-- 1 --")
        time.sleep(sleep_time)


def run2(sleep_time):
    while True:
        print("-- 2 --")
        time.sleep(sleep_time)


def main():
    # 创建进程对象。
    # target:指定线程调用的函数名。注:等号后跟方法名不能加括号,如果加了也能执行函数但threading功能无效
    # args:指定调用函数时传递的参数。注:args是一个数组变量参数,只传一个参数时,需要在参数后面添加逗号
    p1 = multiprocessing.Process(target=run1, args=(1,))
    p2 = multiprocessing.Process(target=run2, args=(1,))

    # 启用子进程
    p1.start()
    p2.start()

    # join方法等待子进程执行结束
    p1.join()
    p2.join()
    print("子进程结束")


if __name__ == "__main__":
    main()

运行上面代码,查看任务管理器python的启动进程数。
在这里插入图片描述
代码中只启动了两个子进程,但是为什么有3个python进程?这是因为,python会创建一个主进程(第1个进程),当运行到p1.start()时会创建一个子进程(第2个进程),当运行到p2.start()时又会创建一个子进程(第3个进程)

2.进程池

进程的创建和删除是需要消耗计算机资源的,如果有大量任务需要多进程完成,则可能需要频繁的创建删除进程,这会给计算机带来较多的资源消耗。进程池的出现解决了这个问题,它的原理是创建适当的进程放入进程池,等待待处理的事件,当处理完事件后进程不会销毁,仍然在进程池中等待处理其他事件,直到事件全部处理完毕,进程退出。 进程的复用降低了资源的消耗。

实现进程池
import time, os

from multiprocessing import Pool


def worker(msg):
    start_time = time.time()
    print(F"{msg}开始执行,进程pid为{os.getpid()}")
    time.sleep(1)
    end_time = time.time()
    print(F"{msg}执行完毕,耗时{end_time - start_time}")


def main():
    po = Pool(3)    # 定义进程池最大进程数为3
    for i in range(10):
        # 每次循环会用空闲出的子进程调用目标
        po.apply_async(worker, args=(i,))   # 若调用的函数报错,进程池中不会打印报错信息

    po.close()  # 关闭进程池,关闭后,不再接收新的目标
    po.join()   # 等待进程池中所有子进程执行完,必须放在close()之后。若没有join()操作,主进程执行完后直接关闭
    print("--end--")


if __name__ == "__main__":
    main()

3.线程

在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。

实现多线程
import time
import threading


def say(sleep_time):
    for i in range(5):
        print(f"说{i+1}下")
        time.sleep(sleep_time)

def dance():
    for i in range(10):
        print(f"跳{i+1}下")
        time.sleep(1)

def main():
    # 创建线程对象
    # target:指定线程调用的函数名。注:等号后跟方法名不能加括号,如果加了也能执行函数但threading功能无效
    # args:指定调用函数时传递的参数。注:args是一个数组变量参数,只传一个参数时,需要在参数后面添加逗号
    t1 = threading.Thread(target=say, args=(1,))
    t2 = threading.Thread(target=dance)

    # 启动线程
    t1.start()
    t2.start()

    # 查看正在运行的线程
    while True:
        now_threading = threading.enumerate()
        print(now_threading)
        # 当子线程全部运行结束后,仅剩1个主线程
        if len(now_threading) <= 1:
            break
        time.sleep(1)


if __name__ == "__main__":
    main()
多线程的资源竞争问题

因为多线程共享全局变量,当线程还没执行完当前任务,操作系统就自动轮流调度执行其他任务,就可能会产生资源竞争的问题。

比如下例中,执行 g_num+=1 时,会将其分成3步执行:1.取值;2.运算;3.保存运算结果,在CPU执行任务时,若刚运行1 2 步就交替执行下一个任务,再返回来保存结果,因为共享全局变量,此时运算结果可能已被重新赋值。

import time
import threading

g_num = 0


def sum1(num):
    global g_num
    for i in range(num):
        g_num += 1
    print(F"sum1:{g_num}")


def sum2(num):
    global g_num
    for i in range(num):
        g_num += 1
    print(F"sum2:{g_num}")


def main():
    t1 = threading.Thread(target=sum1, args=(1000000,))
    t2 = threading.Thread(target=sum2, args=(1000000,))
    t1.start()
    t2.start()
    time.sleep(2)
    print(g_num)    # 执行后,预期结果为2000000;实际不是


if __name__ == "__main__":
    main()

执行结果
在这里插入图片描述
从结果可以看出,sum1和sum2不为1000000,总和不为2000000,这就是上面说的资源竞争问题

互斥锁解决资源竞争问题
import threading
import time

# 定义一个全局变量
g_num = 0

# 创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock()


def sum1(num):
    global g_num
    # mutex.acquire()     # 若在此处上锁,要等下面循环执行完才会解锁,若循环时间太长,会导致另外的线程堵塞等待。
    for i in range(num):
        # 上锁,如果之前没有被上锁,那么此时上锁成功。 上锁原则:一般对产生资源竞争的代码上锁。如果上锁之前 已经被上锁了,那么此时会堵塞在这里,直到 这个锁被解开为止。
        mutex.acquire()
        g_num += 1
        # 解锁
        mutex.release()
    print("-----in test1 g_num=%d----" % g_num)


def sum2(num):
    global g_num
    for i in range(num):
        mutex.acquire()
        g_num += 1
        mutex.release()
    print("-----in test2 g_num=%d=----" % g_num)


def main():
    t1 = threading.Thread(target=sum1, args=(1000000,))
    t2 = threading.Thread(target=sum2, args=(1000000,))

    t1.start()
    t2.start()

    # 等待上面的2个线程执行完毕....
    time.sleep(2)

    print("-----in main Thread g_num = %d---" % g_num)


if __name__ == "__main__":
    main()

运行结果
在这里插入图片描述

死锁

在线程间共享多个资源的时候,如果两个线程分别占用部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用停止响应。下面看一个死锁例子。

import time
import threading


# 创建多个锁
mutexA = threading.Lock()
mutexB = threading.Lock()


def print1():
    mutexA.acquire()
    time.sleep(2)   # 等待B锁稳定
    print("打印A1")
    mutexB.acquire()
    print("打印B1")
    mutexB.release()
    mutexA.release()


def print2():
    mutexB.acquire()
    time.sleep(1)   # 等待A锁稳定
    print("打印B2")
    mutexA.acquire()
    print("打印A2")
    mutexA.release()
    mutexB.release()


def main():
    t1 = threading.Thread(target=print1)
    t2 = threading.Thread(target=print2)

    t1.start()
    t2.start()


if __name__ == "__main__":
    main()

执行结果
在这里插入图片描述
避免死索办法:1、添加超时时间;2、银行家算法(让锁按预期上锁和解锁)

4.协程

协程,又称微线程。协程的作用是在执行函数A时可以随时中断去执行函数B,然后中断函数B继续执行函数A(可以自由切换)。但这一过程并不是函数调用,这一整个过程看似像多线程,然而协程只有一个线程执行。

协程的优势:

  • 执行效率极高,因为子程序切换(函数)不是线程切换,由程序自身控制,没有切换线程的开销。所以与多线程相比,线程的数量越多,协程性能的优势越明显。
  • 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在控制共享资源时也不需要加锁,因此执行效率高很多。
gevent

gevent是第三方库,通过 greenlet 实现 coroutine,创建、调度的开销比 线程(thread) 还小,因此程序内部的 执行流 效率高。

其基本思想是:当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

gevent常用方法:

  • gevent.spawn() 创建一个普通的Greenlet对象并切换
  • gevent.spawn_later(seconds=3) 延时创建一个普通的Greenlet对象并切换
  • gevent.spawn_raw() 创建的协程对象属于一个组
  • gevent.getcurrent() 返回当前正在执行的greenlet
  • gevent.joinall(jobs) 将协程任务添加到事件循环,接收一个任务列表
  • gevent.wait() 可以替代join函数等待循环结束,也可以传入协程对象列表
  • gevent.kill() 杀死一个协程
  • gevent.killall() 杀死一个协程列表里的所有协程
  • monkey.patch_all() 非常重要,会自动将python的一些标准模块替换成gevent框架
import gevent


def task(n):
    for i in range(n):
        print(gevent.getcurrent(), i)


if __name__ == '__main__':
    g1 = gevent.spawn(task, 3)
    g2 = gevent.spawn(task, 3)
    g3 = gevent.spawn(task, 3)

    g1.join()
    g2.join()
    g3.join()

运行结果
在这里插入图片描述
可以看到3个greenlet是依次运行而不是交替运行。要让greenlet交替运行,可以通过gevent.sleep()交出控制权:

import gevent


def task(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(1)


if __name__ == '__main__':
    g1 = gevent.spawn(task, 3)
    g2 = gevent.spawn(task, 3)
    g3 = gevent.spawn(task, 3)

    g1.join()
    g2.join()
    g3.join()

运行结果
在这里插入图片描述
当然在实际的代码里,我们不会用gevent.sleep()去切换协程,而是在执行到IO操作时gevent会自动完成,所以gevent需要将Python自带的一些标准库的运行方式由阻塞式调用变为协作式运行。这一过程在启动时通过monkey patch完成:

import time
import gevent
from gevent import monkey
# 猴子补丁,会自动将python的一些标准模块替换成gevent框架。慎用,它创造了“隐式的副作用”,如果出现问题 它很多时候是极难调试的。
monkey.patch_all()  # 注意:若导出的模块函数不会被替换,比如from time import sleep,sleep不会被替换


def task(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        time.sleep(1)   # 会被gevent自动替换为gevent.sleep()


if __name__ == '__main__':
    g1 = gevent.spawn(task, 3)
    g2 = gevent.spawn(task, 3)
    g3 = gevent.spawn(task, 3)

    g1.join()
    g2.join()
    g3.join()

执行结果
在这里插入图片描述
上面的流程看起来比较繁琐,可以使用 gevent.joinall() 方法简化流程:

import time
import gevent
from gevent import monkey
# 猴子补丁,会自动将python的一些标准模块替换成gevent框架。慎用,它创造了“隐式的副作用”,如果出现问题 它很多时候是极难调试的。
monkey.patch_all()  # 注意:若导出的模块函数不会被替换,比如from time import sleep,sleep不会被替换
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''

def task(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        time.sleep(1)   # 会被gevent自动替换为gevent.sleep()


if __name__ == '__main__':
    gevent.joinall([
        gevent.spawn(task, 4),
        gevent.spawn(task, 4),
        gevent.spawn(task, 4),
    ])

执行结果
在这里插入图片描述

Python 基础 之 python 中 进程、线程、协程对比 区别和联系 Python 基础 之 python 中 进程、线程、协程对比 区别和联系 目录 Python 基础 之 python 中 进程、线程、协程对比 区别和联系 一、简单介绍 二、进程、线程、协程 的定义 1. 进程 2、线程 3、协程 二、进程、线程对比 1、功能 2、定义的不同 3、区别 4、优缺点 三、协程和线程差异 四、进程、线程、协程对比 1、通俗描述阐述... 阅读详情

相关推荐

全桥LLC谐振变换器变频控制工作原理与仿真

全桥LLC谐振变换器以其效率高、全范围软开关、器件电应力小等优点,越来越多地应用于大功率场合。电力电子技术的发展日益追求高频化,所带来的问题是半导体开关器件高频运行时的开关损耗急剧增加。各种软开关电路随之出现。可以有效减小开关损耗,使进一步提高开关频率成为可能。谐振式开关因其可在电流自然过零点开通半导体器件,实现零电压开关,特别适合采用MOSFET作开关的装置。最简单的谐振电路有串联谐振(SRC)和并联谐振(PRC)。SRC只能工作于降压状态,应用受限;

晞子的技术札记 3083

Python实现多进程、多线程以及多协程任务

第三步:进程对象使用multiprocessing.Process();第四步:进程对象.start()正式创建进程。1.4 通过Quene实现多进程之间的通信。3.2 使用gevent实现协程多任务。3.1 使用gevent实现协程。第五步:主进程继续向下运行代码。1.1 多进程函数实现多任务。二、 python实现多线程。2.2 多线程函数实现多任务。三、 python实现多协程。一、python实现多进程。1.2 多进程类实现多任务。2.1 创建对象并传递参数。2.3 多线程类实现多任务。

qq_51350363的博客 3225

字节开源 DeerFlow 2.0:从 Deep Research 到 Super Agent Harness 的进化之路

GitHub Trending 冠军项目,字节跳动完全开源的超级智能体框架。支持子代理、沙箱执行、长期记忆、技能扩展,可完成从几分钟到几小时的复杂任务。本文深度解析架构设计、安装实战、技能系统,并附上独家配置指南。

qq_38610923的博客 1716

python线程、协程

启动线程 回收线程 示例 自定义线程类 Event 线程同步 线程之间用于交互的一个对象,这个event是一个内部的标签,线程可以等待这个标签的状态如果标签(event)没有设置,则线程会一直等待(此时wait是阻塞模式) 线程锁 Lock lock.acquire() 上锁 如果lock已经上锁再调用会阻塞 lock.release() 解锁 with lock: 上锁 … … with 代码块解锁自动解锁 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种

qq_27953479的博客 406

模型算力需求估算

(Billion Parameters,简称B)和训练/推理的计算任务复杂度,结合硬件计算能力(例如每秒浮点运算次数,FLOPS)来估算。以下是详细的方法和公式说明,以及实际的计算示例。算力需求的估算依赖于参数量、模型架构及硬件性能,结合训练/推理场景的特定要求来计算。通过上述公式和示例,我们可以定量分析不同任务的算力需求,并合理配置硬件资源以优化运行效率。结论:推理任务相对较轻,单台H100可以在30秒内完成此任务。推理算力需求一般远低于训练,因为只需要执行前向传播。,可以将训练时间缩短到约。

形上得其象,形下合于数;阴阳自济,玄理自明。 8962

一文读懂,WMS仓库管理系统模块功能

对于仓库管理人员来说,仓储管理是一件需要十分负责、又精细化的工作。

深蓝易网的博客 5219

Python 高级教程之线程进程和协程

💂 个人网站:【 海拥 】【摸鱼小游戏 】 🤟 风趣幽默的人工智能学习网站:👉人工智能 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 💬 便宜且实用的计算机相关书籍:👉进来逛逛 进程 进程是指在系统中正在运行的一个应用程序,是CPU的最小工作单元。 进程 5 种基本状态 一个进程至少具有5种基本状态:初始态、就绪状态、等待(阻塞)状态、执行状态、终止状态。 初始状态:进程刚被创建,由于其他进程正占有CPU资源,所以得不到执行,只能处于初始状态。 就绪状态:只有处于就绪状态的经过调度才能..

努力是为了站在万人之中,成为别人的光 4309

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6412

python中的进程线程和协程

介绍了进程、线程和协程,并通过实例对三种操作进行了展示,最后说明了适合三种并发操作方式的相应场景和任务。

ximu__l的博客 2161

Unity中使用TCP和UDP传输摄像头视频的实践

本文探讨了在Unity中通过TCP和UDP协议传输摄像头视频的实现方法。TCP通过自定义消息帧保证数据完整性但效率较低,UDP传输速度快但可能丢帧。文章提供了Python和Unity的代码示例,分析了两种协议的适用场景:TCP适合要求数据完整性的应用,UDP则适合追求实时性的场景。最终选择取决于具体需求,并需要注意线程安全与同步机制。

m0_74337424的博客 145

OpenHarmony电源管理驱动架构剖析:HDI框架下的低功耗实现

鸿蒙电源管理驱动模块是OpenHarmony操作系统中负责设备电源状态管理的核心组件。该模块基于HDI(Hardware Device Interface)框架实现,提供了完整的电源管理功能,包括系统休眠/唤醒、运行锁管理、休眠模式控制等核心功能。public:// 主要接口函数// 运行锁管理private:// 内部辅助函数// 成员变量public:// 运行锁控制接口// 回调管理private:// 内部辅助函数。

m0_67505153的博客 209

【保姆级教程】Python 多任务编程:进程、线程、协程从入门到实战

多任务就是让程序 “同时” 处理多个任务(比如电脑同时运行微信、浏览器、PyCharm),核心目的是提高资源利用率、减少等待时间。Python 多任务编程的核心是根据场景选对工具进程:适合 CPU 密集型任务,突破 GIL 限制,利用多核 CPU;线程:适合中等并发的 IO 密集型任务,实现简单;协程:适合高并发的 IO 密集型任务,资源开销最低,效率最高。学习的关键是 “理解概念 + 动手实战”—— 从简单的多线程下载、多进程计算开始,逐步过渡到协程爬虫,最终能根据业务场景灵活选择最优方案。

2301_80137277的博客 686

【Python机器学习】主成分分析(PCA):高维数据的“瘦身术“

主成分分析(PCA)的历史可以追溯到1901年,当时Karl Pearson首次提出了这个概念。在计算机还不存在的年代,PCA是一个纯粹的数学构想,用来简化多变量数据的分析。几十年后,当计算机出现时,PCA成为了数据分析中最早实现的算法之一。从那时起,超过一个世纪的发展中,PCA一直保持着其核心的理论框架和实用价值,这本身就是对这个方法深刻科学性的证明。在现代深度学习时代,许多人可能会认为PCA已经过时了。但事实恰好相反。

nmdbbzcl的博客 981

Python 进程、线程、协程傻傻分不清楚?详细总结(附代码)

还在害怕多进程、多线程?没听过协程的概念?一文讲清楚Python中的并发编程,并配套实战代码,助你进阶Python

FRIGIDWINTER的博客 8416

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【python】python进程、线程、协程和什么时候使用

说明 进程:是操作系统进行资源分配的最小单元,资源包括CPU、内存、磁盘等IO设备等等 线程:是CPU调度的基本单位。 进程:系统分配资源的载体,是程序运行的实例; 线程:程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。 为什么有人说 Python 多线程是鸡肋? 在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎...

我的笔记本 9001

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

进程、线程、协程

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。首先这三者是有明显的大小关系进程 > 线程 > 协程一个进程可以有多个线程,一个线程里面可以有多个协程例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

啊猪是的读来过倒的博客 2593

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python 多任务编程全解:进程、线程与协程从入门到实战

本文系统讲解 Python 多任务编程的核心技术:进程、线程与协程。从 “多任务的并发 / 并行概念” 切入,先解析进程的独立资源、多进程实现方式与注意事项(如进程不共享全局变量);再讲线程的共享资源特性、线程安全问题及同步方案;最后介绍协程的单线程并发优势与异步实战(如协程爬虫)。内容覆盖基础概念、代码实例、实战场景,破解 “进程 / 线程区别”“线程安全”“协程异步 IO” 等难点,是 Python 开发者掌握高效多任务编程的实用指南。

海市公约的博客 1454

Python 多任务编程:进程、线程与协程全面解析

多任务指在同一时间内执行多个任务,比如电脑同时运行微信、浏览器和代码编辑器。其核心价值是充分利用 CPU 资源,提升程序执行效率。CPU 密集型任务(如计算、矩阵运算):用多进程(绕过 Python GIL 锁,利用多核 CPU);I/O 密集型任务(如网络请求、文件读写):优先用协程(效率最高、资源开销最低),其次用多线程;简单多任务场景:若无需多核利用,用多线程(实现简单、通信方便)。

qq_73946316的博客 978

python进程,线程与协程

协程(Coroutine)是⽤户态的轻量级线程,通过协作式多任务实现并发。相⽐线程,协程的切换⽆需操 作系统调度,仅需保存寄存器上下⽂,因此效率更⾼。核⼼优势:1. ⽆锁机制:避免多线程同步开销2. ⾼并发:单线程内处理数千级I/O密集型任务(如⽹络请求)3. 代码简洁:⽤同步语法写异步逻辑( async/await )

Darenm111的博客 1039

Python线程进程协程

Python线程进程协程 所讲内容: 多任务的介绍 多任务的概念 线程(重点) 线程(注意点) 多线程-共享全局变量(重点) 多线程-共享全局变量-问题 同步 互斥锁 案例:多任务版udp聊天器 进程以及状态 进程的创建-multiprocessing 进程、线程对比 进程间通信-Queue 进程池Pool 应用:文件夹copy器(多进程版) 生成器 协程-yield 协程-greenlet 协程...

weixin_44217401的博客 1170

Python的进程、线程、协程

生活中,你可能一边听歌,一边写作业;一边上网,一边吃饭。。。这些都是生活中的多任务场景。电脑也可以执行多任务,比如你可以同时打开浏览器上网,听音乐,打开pycharm编写代码.。简单的说多任务就是同一时间内运行多个程序:操作系统轮流让各个任务交替执行,QQ执行2us,切换到微信,在执行2us,再切换到陌陌,执行2us..。表面是看,每个任务反复执行下去,但是CPU调度执行速度太快了,导致我们感觉就行所有任务都在同时执行一样。

niubilitygeorge的博客 1036

Python篇:多任务编程——进程,线程,协程详解

文章目录多任务编程概念单核CPU如何实现“多任务”多核CPU如何实现“多任务”多进程编程进程的创建进程 VS 程序进程的五状态模型创建⼦进程多进程修改全局变量多进程编程多进程编程方法1: 实例化对象多进程编程方法2: 创建子类进程池为什么需要进程池Pool?实现方式进程间通信目的方式消息队列代码实现多线程编程什么是线程?线程和进程各自的区别和优劣线程分类线程的⼏种状态多线程编程实现方法方法一:实例...

Dreaming5498的博客 684

python进阶之多任务编程(进程&线程&协程)

本篇文章目录 一、多任务编程 1、什么叫多任务 2、单核CPU如何实现多任务 3、多核CPU如何实现多任务 二、多进程编程 1、进程的创建 2、多进程编程 3、进程间通信 三、多线程编程 1、什么是线程 2、线程和进程的区别 3、多线程编程 4、GIL全局解释器锁 5、线程同步和线程锁 6、死锁 四、协程 1、什么是协程 2、协程的优势 3、线程的实现 五、总结 一、多任务编程 1、多任务的...

daidadeguaiguai的博客 1326

【python面试宝典11】多进程、多线程和协程

由于进程的执行顺序问题,造成了 pr 先于 pw 执行,所以 pr 未读取到数据,pr 进程任务结束,堵塞解开,主进程继续向下运行,最后 pw 任务结束。进程之间的通信可以通过队列(Queue)来进行,多个进程一部分向队列里写入数据,一部分从队列里读取数据,从而完成多进程之间的通信问题。线程是进程下的一部分,进程下负责执行代码程序的就是线程,一个进程下会有很多个线程。在这中间只有一个线程在运行,任务的切换时机由程序员自己控制,避免了由于多线程之间的切换消耗,这样就简单实现了协程。异步(asyncio)

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 1754

Python 多任务编程:进程、线程、协程全解

在 Python 开发中,多任务编程是提升程序执行效率、充分利用 CPU 资源的核心手段,而进程和线程是实现多任务的两种核心方式。这篇博客主要讲python多线程和多进程的原理和常用操作,python多任务编程和java的内容和用法都是相似的。

勇往直前的博客 566

Python从入门到精通3:进程、线程与协程详解

进程(Process)是操作系统进行资源分配和调度的基本单位,是资源分配的最小单位。简单说,一个运行中的程序就是一个进程。特点每个进程有独立的内存空间(每个进程需要占用一个CPU)进程间不共享全局变量(数据不共享)创建进程开销较大进程传参-----args元组类型传参,kwargs 字典类型传参多进程的使用是顺序规则:主进程结束,子进程必须结束(1)设置进程守护work_process.daemon = True # 设置为守护进程。

m0_74488469的博客 1284
上一篇: Python字符串常用操作
下一篇: Python三元运算用法教程
Python热爱者
博客等级 码龄7年 3059粉丝 1330原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值