协程

Golang:线程 和 协程 的区别

ぐ巨炮叔叔 提交于 2020-01-28 12:44:21
目录 前言 协程 和线程的整体对比 协程的特点 第 1 和 第 2 点 特点中的第 3 和 第 4 点 前言 19年也快结束了。现在的总结更多是放在了草稿 而没有发出,这次详细分享下在 Go 中,线程和协程的区别及其关系。 协程 协程,英文名Coroutine。但在 Go 语言中,协程的英文名是:gorutine。它常常被用于进行多任务,即并发作业。没错,就是多线程作业的那个作业。 虽然在 Go 中,我们不用直接编写线程之类的代码来进行并发,但是 Go 的协程却依赖于线程来进行。 下面我们来看看它们的区别。 线程的基础介绍,这里请自行网上搜索文章,因为关于线程的优秀介绍文章已经很多。 协程的特点 这里先直接列出线程的特点,然后从例子中进行解析。 多个协程可由一个或多个线程管理, 协程的调度 发生在其所在的线程中。 可以被调度, 调度策略 由应用层代码定义,即可被高度自定义实现。 执行效率高。 占用内存少。 上面 第 1 和 第 2 点 我们来看一个例子: func TestGorutine ( t * testing . T ) { runtime . GOMAXPROCS ( 1 ) // 指定最大 P 为 1,从而管理协程最多的线程为 1 个 wg : = sync . WaitGroup { } // 控制等待所有协程都执行完再退出程序 wg . Add ( 2 ) //

进程,线程和协程 并行与并发

谁说我不能喝 提交于 2020-01-28 02:56:57
一、进程 进程的出现是为了更好的利用CPU资源使到并发成为可能。 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行。注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B等等。登登登,进程就被发明出来了。通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之为上下文切换。进程是系统资源分配的最小单位,进程占用的资源有: 地址空间 全局变量 文件描述符 各种硬件资源 相比线程和协程,进程是比较重量级的,它需要的资源很多。进程之间不共享内存变量,所以进程间的通信方式也多种多样: TCP REDIS等数据库 管道,文件等 二、线程 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使得进程内并发成为可能。假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容

Python多进程、多线程、协程

丶灬走出姿态 提交于 2020-01-27 08:27:35
转载:https://www.cnblogs.com/huangguifeng/p/7632799.html 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务。 一个CPU,在一个时间切片里只能运行一个程序。 从操作系统的角度: 进程和线程,都是一种CPU的执行单元。 进程:表示一个程序的上下文执行活动(打开、执行、保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...) 一个程序至少有一个进程,一个进程至少有一个线程。 并行 和 并发: 并行:多个CPU核心,不同的程序就分配给不同的CPU来运行。可以让多个程序同时执行。 cpu1 ------------- cpu2 ------------- cpu3 ------------- cpu4 ------------- 并发:单个CPU核心,在一个时间切片里一次只能运行一个程序,如果需要运行多个程序,则串行执行。 cpu1  ----  ---- cpu1    ----  ---- 多进程/多线程: 表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。 进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。 进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。 线程:一个进程可以有多个线程

python 高性能编程之协程

独自空忆成欢 提交于 2020-01-27 08:24:38
用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,“协程 + 多进程”的组合渐渐被认为是未来发展的方向。技术容易更新,思维转变却需要一个过渡。我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应。这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结。尽管这个总结的可靠性很值得怀疑,但是我还是决定记录下来,因为我觉得既然是学习者,就不应该怕无知。如果读者发现我的看法有偏差并指出来,我将非常感激。 多线程下异步编程的方式 线程的出现,为开发者带来了除多进程之外另一种实现并发的方式。比起多进程,多线程有另一些优势,比如可以访问进程内的变量,也就是共享资源。还有的说法说线程创建比进程创建开销低,考虑到这个问题在 Windows 一类进程创建机制很蹩脚的系统才存在,故先忽略。总的来说,线程除了可以实现进程实现的“并发执行”之外,还有另一个功能,就是管理应用程序内部的“事件”。我不知道把这种事件处理分类到异步中是不是合适,但事件处理一定是基于共享进程内资源才能实现的,所以这是多线程可以做到而多进程做不到的一点。 异步处理基于两个前提。第一个前提是支持并发

爬虫小案例:多协程工作

送分小仙女□ 提交于 2020-01-26 22:46:59
为提高工作效率,让多个爬虫一起工作 需要使用的库是:gevent 1.方式一:使用队列的形式: from gevent import monkey # 从gevent库里导入monkey模块。 monkey.patch_all() # monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。 import gevent,time,requests # 导入gevent、time、requests from gevent.queue import Queue # 从gevent库里导入queue模块 start = time.time() # 记录开始时间 url_list = [ 'https://www.baidu.com/', 'https://www.sina.com.cn/', 'http://www.sohu.com/', 'https://www.qq.com/', 'https://www.163.com/', 'http://www.iqiyi.com/', 'https://www.tmall.com/', 'http://www.ifeng.com/' ] # 要爬取的网站 work = Queue() # 创建队列对象,并赋值给work。 for url in url_list: work.put_nowait(url) #

python进阶之多线程(简单介绍协程)

﹥>﹥吖頭↗ 提交于 2020-01-26 19:22:06
多线程 线程:实现多任务的另一种方式 一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务,就是线程 线程又被称为 轻量级进程 (lightweight process),是更小的执行单元 一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源 一个进程中的线程共享相同的内存单元/内存地址空间可以访问相同的变量和对象,而且它们从同一堆中分配对象通信、数据交换、同步操作 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快 线程与进程的区别 一般来讲:我们把进程用来分配资源,线程用来具体执行(CPU调度) 多线程的创建(函数和类) 创建线程的两种方式: 第一:通过 threading.Thread 直接在线程中运行函数; import threading,time def saySorry(): print("子线程%s启动" %(threading.current_thread().name)) #当前线程的名字 time.sleep(1) print("我能吃饭了吗?") if __name__ == "__main__": print('主线程%s启动' %(threading.current_thread().name)) for i in range(5):

Go协程间通信 # 生产者-消费者模型

☆樱花仙子☆ 提交于 2020-01-26 05:55:27
Go协程间通信之 生产者-消费者模型 通信原则 Go开发有一个经常提及的原则: 不要通过共享内存来通信(互斥锁同步),而要用通信来共享内存。 前言 在其他模式的开发语言中,比如Java有个常见的生产者-消费者模式,通过多个线程池与多个 BlockingQueue 进行交互,如 LinkBlockedQueue , ArrayBlockedQueue 等 ,由于队列内部通过锁机制帮我们集成了同步的功能,程序业务层不需要关心多线程对队列的竞争,所以可以放心的使用。 而来到Go这边,由于 channel 天生具备同步的特性,结合上面提到的通信原则,也可以较简单的运用于 生产者-消费模型 。 示例 创建一个共享队列作为生产者消费者连接的管道 var ( //通信管道大小 QUEUE_SIZE = conf . OptiInt ( "ext.queueSize" , 5 ) //生产者并发度 PRODUCE_SIZE = conf . OptiInt ( "ext.prodSize" , 3 ) //消费者并发度 CONSUME_SIZE = conf . OptiInt ( "ext.consSize" , 3 ) ) //共享队列 msgQueue := make ( chan [ ] byte , QUEUE_SIZE ) 消费端业务 /* * CNum标识不同消费者的序号,由外部传入

Python学习笔记:协程初探

对着背影说爱祢 提交于 2020-01-26 03:43:57
(本文主要参照Python在线文档进行学习) 0.前言 进程有自己独立的堆和栈,由操作系统调度;线程有独立的栈,共享堆空间,标准的线程也是由操作系统调度;协程和线程一样共享堆不共享栈,但是是由程序员在协程的代码里显示调度。协程避免了无意义的调度,进而提升性能,但也增加了程序员的责任。 1.初探 asyncio是一个使用 async / await 语法编写并发代码的库,在Python 3.4 引入,直接内置了对异步IO的支持,并在后来的版本中不断完善。早期基于生成器来实现协程,但是在 Python 3.8 开始不推荐使用该方式,并将在 3.10 移除。目前标准的是使用 async / await 语法来实现协程。 要实际运行协程,asyncio 提供了三种主要机制: a.使用 asyncio.run() 函数来运行顶层入口点 (运行代码需要 Python3.7 ;要注意的是,直接调用 func() 并不能执行) import asyncio import time async def func(): print('func in'+time.strftime('%X')) await asyncio.sleep(3) print('func out'+time.strftime('%X')) print('begin'+time.strftime('%X')) asyncio

进程、线程与协程对比

纵饮孤独 提交于 2020-01-26 03:22:01
进程、线程与协程对比 进程是资源分配的单位 线程是操作系统调度的单位 进程切换消耗的资源最大,效率最低 线程切换消耗的资源一般,效率一般(排除锁的情况) 线程切换消耗的资源很小,效率很高 多进程、多线程根据cpu核数不同,可能是并行的,但是协程在一个线程中,所以是并发的 来源: CSDN 作者: wisewho? 链接: https://blog.csdn.net/weixin_44225602/article/details/103746037

【多任务协程高级day04】greenlet+安装方式+运行效果

微笑、不失礼 提交于 2020-01-25 08:45:03
文章目录 greenlet 安装方式 运行效果 greenlet 为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单 安装方式 使用如下命令安装greenlet模块: sudo pip3 install greenlet #coding=utf-8 from greenlet import greenlet import time def test1(): while True: print "---A--" gr2.switch() time.sleep(0.5) def test2(): while True: print "---B--" gr1.switch() time.sleep(0.5) gr1 = greenlet(test1) gr2 = greenlet(test2) #切换到gr1中运行 gr1.switch() 运行效果 - - - A - - - - - B - - - - - A - - - - - B - - - - - A - - - - - B - - - - - A - - - - - B - - . . . 省略 . . . 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104072916