协程

协程

ⅰ亾dé卋堺 提交于 2019-11-26 10:21:50
一、阻塞和非阻塞 1. 程序运行中的状态 New 进程正在被创建 Running 进程的指令正在被执行 Waiting 进程正在等待一些事件的发生(例如 I/O 的完成或者收到某个信号) Ready 进程在等待被操作系统调度 Terminated 进程执行完毕(可能是被强行终止的) 2. 定义 阻塞和非阻塞描述的是进程的一个操作是否会使进程转变为等待的状态。 阻塞:程序调用了包含I/O操作的system call,因为system call涉及到了I/O操作不能立即完成,于是内核会将该程序设置为等待状态,调度其他的进程运行,等到它所请求的IO操作完成了以后,再将其改回就绪状态。 非阻塞:程序没有IO操作(或者调用了非阻塞I/O系统调用,一个非阻塞I/0系统调用不会让进程挂起),或者遇到IO通过某种手段让CPU去执行该进程的其他任务(协程)。 二、 同步异步 1. 定义 站在任务发布的角度 同步: 进程将任务发出去之后,等待,直到这个任务最终结束之后,给进程一个返回值,进程再在发布下一个任务 异步:进程发布一个任务后,立即得到一个返回值,就去发布下一个任务;前面发布的任务运行完毕得到结果后会给进程发送一个信号,让进程去接收结果 2. 异步 + 调用机制(爬虫) 版本一:多进程并发执行爬取数据,串行执行数据处理 from concurrent.futures import

golang网络编程高并发

心不动则不痛 提交于 2019-11-26 05:38:24
1 golang写服务器不需要epoll吗 golang写服务器不需要在用reactor模式的epoll了,因为golang的协程非常廉价,可以并发开启成千上完个协程。 一个协程占用内存大概2KB左右,一个线程占用内存大概2MB左右,一个线程抵1000个协程。 所以,用golang写服务器程序会简单很多。 来源: https://www.cnblogs.com/hustdc/p/11316440.html

Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求

霸气de小男生 提交于 2019-11-26 00:09:36
前言 最近一直在修炼Kotlin,说实话真香真好用,刚好公司准备交给我一个新项目,于是打算直接用Kotlin来构建项目。刚好整体架构搭建完毕了,于是把网络请求这一部分先分享给大家。这次使用到的是 协程+ retrofit +mvvm的模式,我这儿直接用一个简单的demo来看一下具体的实现方式吧。文章只是描述实现思路,需要demo的直接跳到文末。 项目配置 首先先引入所需要的依赖 implementation 'android.arch.lifecycle:extensions:1.1.1' //协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1' //retrofit + okHttp3 implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines

异步IO-数据库-队列-缓存10

筅森魡賤 提交于 2019-11-25 21:34:18
Python之路,Day10 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱