0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中的多核CPU共享数据之协程详解

马哥Linux运维 2017-12-07 10:23 次阅读

一 : 科普一分钟

尽管进程间是独立存在的,不能相互访问彼此的数据,但是在python中却存在进程间的通信方法,来帮助我们可以利用多核CPU也能共享数据.

对于多线程其实也是存在一些缺点的,不是任何场景我们都用多线程来完成并发处理任务,因为CPU操作线程,所以线程多了,对于计算机的资源消耗是十分严重的,多线程适合IO操作密集的任务,那么怎么办呢, 协程的出现帮我们解决了这个问题 ,协程是比线程更小的一个单位,但是它的作用却不容忽视.

二 : 多进程

1.多进程简单了解 :

进程之间是独立的,是操作系统自己来维护和管理的,python通过C接口起了一个进程,多进程可以充分的利用多核CPU

2. 多进程的创建 :

3. 多进程间的通信 :

进程间独立,如果想相互访问,就必须有一个中间翻译,下面提供了几种进程间通信的方法。

进程Queue

解析 :

Queue通信,相当于父进程赋值了一个Queue给子进程,子进程在这个Queue放好数据后,序列化一个中间翻译,然后在反序列化返回给父进程,

因为进程之间内存独立,不能传递对象传递的其实就是序列化的数据

Pipe

多进程还有一种数据传递方式叫管道原理和Queue相同

4. 进程锁

虽然内存独立,但是即使是打印也会造成打印数据错误,为了防止进程间抢屏幕打印输出,加了进程锁。

5. 进程池

创建一个子进程相当于copy一份父进程内存数据,为了防止频繁创建,导致内存不足,所以有了进程池作为限制。

三 : 协程

1. 协程的简单了解 :

协程又称微线程,coroutne,协程是一种用户态的轻量级线程。通俗点讲就是周末我在家里休息,假如我先洗漱,再煮饭,再下载电影看会很慢,用了协程的效果就好比,我在下载电影的时候去点火煮饭,此时我马上洗漱,等我洗漱好了,饭也好了,吃完饭了,电影下好了,我可以看了。

2. 协程的创建和使用:

gevent是一个三方库,可以轻松通过gevent实现并发同步或者异步编程

解析:尝试运行发现,运行时间为Sleep最长的时间,也就是说协程能绕过IO,进行执行,极大的提高了效率.

IO(从硬盘上读一块数据,从网络读数据,从内存里读一块数据) 操作不占用CPU,计算占用CPU

3. 协程简单爬网页 :

4. 协程实现socketServer:

通过协程,我们可以写出一个socketServer,真正socketServer的底层是用多线程来实现,我们用写成写出的效率很高,而且非常节省内存

四 : 总结

协程的优点:

线程在单线程下切换,减少资源消耗

无需原子操作控制流,简化编程模型

高并发,高扩展,低成本.

无论是多进程,多线程还是协程在不同的场景用不同的模型才能高效的完成任务.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10850

    浏览量

    211517
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84614

原文标题:Python篇-多进程与协程的理解与使用

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    谈谈的那些事儿

    随着异步编程的发展以及各种并发框架的普及,作为一种异步编程规范在各类语言中地位逐步提高。我们不单单会在自己的程序中使用,各类框架如fastapi,aiohttp等也都是基于异步
    的头像 发表于 01-26 11:36 1109次阅读
    谈谈<b class='flag-5'>协</b><b class='flag-5'>程</b>的那些事儿

    基于共享内存多核数据结构研究

    随着计算机硬件技术的发展,如今我们已经迈入了多核CPU时代.然而,作为软件核心的数据结构仍然是按照单核CPU和顺序型准则来设计的.在基于共享
    发表于 01-15 11:34 0次下载

    Python自动化运维函数赋值过程

    的优点:(1)无需线程上下文切换的开销,避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,
    的头像 发表于 03-18 11:22 3726次阅读

    关于C++ 20最全面详解

    花了一两周的时间后,我想写写 C++20 的基本用法,因为 C++ 的让我感到很奇怪,写一个
    的头像 发表于 04-12 11:10 1.3w次阅读
    关于C++ 20<b class='flag-5'>协</b><b class='flag-5'>程</b>最全面<b class='flag-5'>详解</b>

    Python后端项目的是什么

    最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用“异步”的方式实现。看着满屏幕经过 async await(
    的头像 发表于 09-23 14:38 1324次阅读

    Python与JavaScript的对比及经验技巧

    对这两个语言有兴趣的新人理解和吸收。 共同诉求随着 cpu 多核化,都需要实现由于自身历史原因(单线程环境)下的并发功能 简化代码,避免回调地狱,关键字支持 有效利用操作系统资源和硬件:
    的头像 发表于 10-20 14:30 1920次阅读

    使用channel控制数量

    goroutine 是轻量级线程,调度由 Go 运行时进行管理的。Go 语言的并发控制主要使用关键字 go 开启 goroutine。Go (Goroutine)之间通过信道(
    的头像 发表于 09-19 15:06 1129次阅读

    详解Linux线程、线程与异步编程、与异步

    不是系统级线程,很多时候被称为“轻量级线程”、“微线程”、“纤(fiber)”等。简单来说可以认为
    的头像 发表于 03-16 15:49 974次阅读

    的概念及的挂起函数介绍

    是一种轻量级的线程,它可以在单个线程实现并发执行。与线程不同,不需要操作系统的上下文切换,因此可以更高效地使用系统资源。Kotli
    的头像 发表于 04-19 10:20 881次阅读

    Kotlin实战进阶筑基篇1

    。 Android 的每个应用都会运行一个主线程,它主要是用来处理 UI,如果主线程上需要处理的任务太多,应用就感觉被卡主一样影响用户体验,得让那些耗时的任务不阻塞主线程的运行。要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回调,另一种是使用
    的头像 发表于 05-30 16:24 705次阅读
    Kotlin<b class='flag-5'>协</b><b class='flag-5'>程</b>实战进阶<b class='flag-5'>之</b>筑基篇1

    Kotlin实战进阶筑基篇2

    。 Android 的每个应用都会运行一个主线程,它主要是用来处理 UI,如果主线程上需要处理的任务太多,应用就感觉被卡主一样影响用户体验,得让那些耗时的任务不阻塞主线程的运行。要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回调,另一种是使用
    的头像 发表于 05-30 16:25 707次阅读
    Kotlin<b class='flag-5'>协</b><b class='flag-5'>程</b>实战进阶<b class='flag-5'>之</b>筑基篇2

    Kotlin实战进阶筑基篇3

    。 Android 的每个应用都会运行一个主线程,它主要是用来处理 UI,如果主线程上需要处理的任务太多,应用就感觉被卡主一样影响用户体验,得让那些耗时的任务不阻塞主线程的运行。要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回调,另一种是使用
    的头像 发表于 05-30 16:26 690次阅读

    FreeRTOS任务与介绍

    FreeRTOS 应用既可以使用任务,也可以使用(Co-Routine),或者两者混合使用。但是任务和协使用不同的API函数,因此不能通过队列(或信号量)将
    的头像 发表于 09-28 11:02 981次阅读

    的作用、结构及原理

    本文介绍了的作用、结构、原理,并使用C++和汇编实现了64位系统下的池。文章内容避免了
    的头像 发表于 11-08 16:39 1108次阅读
    <b class='flag-5'>协</b><b class='flag-5'>程</b>的作用、结构及原理

    何选择一个合适的来获得CPU执行权

    如今虽不敢说已经是红的发紫,但确实是越来越受到了大家的重视。Golang的已经是只有goroutine,以至于很多go程序员是只知有
    的头像 发表于 11-13 14:10 397次阅读
    何选择一个合适的<b class='flag-5'>协</b><b class='flag-5'>程</b>来获得<b class='flag-5'>CPU</b>执行权