协程

爬虫之线程&协程&异步

空扰寡人 提交于 2020-03-20 23:23:55
线程池 导包: from multiprocessing.dummy import Pool 回调函数异步将可迭代对象中的元素进行某种操作 注意事项:callback必须有一个参数,且只能有一个参数 异步主要是被应用在耗时的操作 from multiprocessing.dummy import Pool pool = Pool(3) # 实例化线程池对象,3是线程池的最大线程数 # 参数1:回调函数(只是函数名,不加括号);参数2:列表 # 参数1会接收参数2列表中的某一个元素,回调函数可以对该列表元素进行某种操作 pool.map(callback,list) 测试:同步&异步效率 搭建一个flask,自己启动服务,测试执行时间 新建一个 server.py from flask import Flask, render_template import time app = Flask(__name__) @app.route('/xx') def index_1(): time.sleep(2) return render_template('test.html') @app.route('/yy') def index_2(): time.sleep(2) return render_template('test.html') @app.route('/oo') def

单核CPU、并行、进程、线程、纤程、协程出现必要性解析

懵懂的女人 提交于 2020-03-11 16:51:20
并发/并行 从物理基础元素角度来看,当只有一个CPU时,执行一个程序这个程序就会一直占用CPU,直到程序运行结束。 如果这个程序的运行过程中,需要用到CPU的部分很快就结束了,程序的其他环节(比如IO阻塞等)正在占用时间,此时CPU是空置的。 于是就有了并发。 并发的不足 并发执行加速了对CPU的使用效率,也带来了问题。 程序A运行到一半,程序B进来抢占CPU,程序A的 中间状态 /内存/变量怎么办? 因此,在同一个CPU里的并发需要处理好 上下文切换 的问题。 进程的出现 让CPU处理两个程序,就像男女结婚一样。两人结婚并不是两个人凑在一起过日子,而是两个家庭在进程资产重组。不是丈夫+妻子,而是丈夫+妻子and丈夫+岳父and丈夫+岳母and妻子+婆婆… 将计算主业及所需附属等整合在一起抽象出来的概念,就叫进程。 这个概念能够独立运行。涉及到大量计算机资源的配置,如果任由用户程序配置,太过复杂也会冲突。 因此就出现了 操作系统 。 操作系统直接跟底层资源配置打交道,用户程序只需要跟操作系统打交道就行了。 上下文切换(Context Switch) 上下文切换主要是指进程的上下文切换,发生在内核态,由内核调度器执行。 上下文,指的是进程的运行状态。 当一个进程的时间片用完,内核将保存该进程的运行状态(即上下文),将其存入运行队列(Run Queue),同时让新的进程占用CPU。

线程、进程、协程概念辨析

ε祈祈猫儿з 提交于 2020-03-11 16:26:49
线程和进程 线程、进程经常放在一起对比: 《线程||进程||行程||多线程||多进程一次搞清》 《IO密集型任务(多线程)||计算密集型(多进程)》 线程 是最小单位, 进程 内至少包含一个 线程 。 对操作系统来说, 线程 是最小的执行单元, 进程 是最小的资源管理单元。 进程 间的切换(涉及栈、寄存器、虚拟内存、文件句柄等)开销较大,但是相对安全; 不同进程 通过进程间通讯来通信。 线程 是比进程更小的、CPU调度和分派的、能独立运行的基本单位,可与同属一个进程的其他的线程共享进程所拥有的全部资源; 线程间 通信主要通过 共享内存 。 协程概念 协程 ,英文名***Coroutine***。 协程 是一种用户态的轻量级线程,协程的调度完全由用户控制,拥有自己的寄存器上下文和栈。 一台机器只执行一个程序太浪费CPU资源了,当某个程序执行IO时就让出CPU资源交给另一个程序执行,这就是 协程的思想 。 协程是实现异步的一种方式。 从编程角度,协程的思想本质上就是控制流的主动让出(yield)和恢复(resume)机制。 协程与线程/进程的区别 编译器与操作系统 协程 是 编译器 级的,Process和Thread是 操作系统级 的。 操作系统级的意思是对算法的调度是通过OS执行的,每次跑到OS分配的CPU时间后就会被OS强制挂起,开发者无法精确控制他们。 Coroutine

Python-常见面试题

杀马特。学长 韩版系。学妹 提交于 2020-03-11 08:59:59
什么是Python Python是一种解释型语言,也就是说,它和C语言以及C的衍生语言不通,Python代码在运行之前不需要编译 Python是一种动态类型语言,指的是,你在声明变量时不需要指定变量的类型 Python让困难的事变的容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节 Python用途非常广泛–网络应用,自动化,科学建模,大数据应用等等,它也常被用作“胶水语言”,用于帮助其他语言和组件改善运行状况 Python支持的数据类型 数字、字符串、元组、字典、列表 下划线的作用 _xxx:表示的是protected类型,即只允许其本身和子类进行访问 __xxx:表示的是private类型 __xxx__:表示的特列方式,如__init__ 如何生成一个不可变集合 使用 frozenset 函数,将一个列表变成一个不可变的集合,如下: s = frozenset([1, 2, 3]) is与== is对比地址,==是对比值 多线程与多进程 对比维度 多进程 多线程 数据共享、同步 数据共享复杂,需要用到IPC;数据是分开的、同步简单 因为共享进程数据,所以共享简单,但也因为这个导致同步复杂 内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存小,切换简单,CPU利用率高 创建、销毁、切换 创建销毁、切换复杂,速度很慢 创建销毁、切换简单,速度很快 编程

【11.4】协程是什么?

本秂侑毒 提交于 2020-03-11 06:47:26
协程--可以暂停的函数(可以向暂停的地方传入值) 协程,又称微线程,纤程。英文名Coroutine。 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。 子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。比如子程序A、B: 1 def A(): 2 print '1' 3 print '2' 4 print '3' 5 6 def B(): 7 print 'x' 8 print 'y' 9 print 'z' 假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是: 1 1 2 2 3 x 4 y 5 3 6 z 但是在A中是没有调用B的,所以协程的调用比函数调用理解起来要难一些。 看起来A、B的执行有点像多线程,但协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

Android平台的Swift—Kotlin

亡梦爱人 提交于 2020-03-10 23:44:06
WeTest 导读 Kotlin 已经出来较长一段时间了,有些同学已经对Kotlin进行了深入的学习,甚至已经运用到了自己的项目当中,但是还有较多同学可能只是听过Kotlin或简单了解过,这篇文章的目的是让这些同学对Kotlin有一个系统全面的认识,让有兴趣的同学在之后学习的时候能更加的轻车熟路。 什么是kotlin? 一、一门静态编程语言 跟java,c一样的强类型语言,变量的数据类型在编译时确定。对比的JavaScript,python则是动态编程语言。 二、JetBrians开发设计 一家捷克的软件公司,是著名的IDE开发商,对很多的开发语言和平台都提供了相应的集成开发环境,比如Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成开发环境,被称为目前最好用的java IDE。而且Android Studio就是Google基于IntelliJ IDEA 开发的,由此可见Google和JetBrains的合作也是比较密切的。而从以上说明也可以看到JetBrains不仅实力强劲,这家公司对于语言设计更是有天然优势。Kotlin是集多家语言之大成。 三、Kotlin是开源的(基于Apache 2.0开源许可协议) 我们在GitHub上可以下载Kotlin的全部源代码。而且可以自己进行代码修改,再发布。

Android平台的Swift—Kotlin

∥☆過路亽.° 提交于 2020-03-10 23:43:10
WeTest 导读 Kotlin 已经出来较长一段时间了,有些同学已经对Kotlin进行了深入的学习,甚至已经运用到了自己的项目当中,但是还有较多同学可能只是听过Kotlin或简单了解过,这篇文章的目的是让这些同学对Kotlin有一个系统全面的认识,让有兴趣的同学在之后学习的时候能更加的轻车熟路。 什么是kotlin? 一、一门静态编程语言 跟java,c一样的强类型语言,变量的数据类型在编译时确定。对比的JavaScript,python则是动态编程语言。 二、JetBrians开发设计 一家捷克的软件公司,是著名的IDE开发商,对很多的开发语言和平台都提供了相应的集成开发环境,比如Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成开发环境,被称为目前最好用的java IDE。而且Android Studio就是Google基于IntelliJ IDEA 开发的,由此可见Google和JetBrains的合作也是比较密切的。而从以上说明也可以看到JetBrains不仅实力强劲,这家公司对于语言设计更是有天然优势。Kotlin是集多家语言之大成。 三、Kotlin是开源的(基于Apache 2.0开源许可协议) 我们在GitHub上可以下载Kotlin的全部源代码。而且可以自己进行代码修改,再发布。

Unity中的协程 简单理解

无人久伴 提交于 2020-03-10 19:11:41
在Unity中有这样一个概念——协程 我理解的协程概念,就是一个方法,但是可以将这个方法的中间过程挂起,过一段时间或者一些操作后再继续这个方法。 通常,协程的结构就是这样的: IEnumerator Test() { /*内容 内容*/ yield return 0; } 开启协程 StartCoroutine(“协程方法名“); 关闭协程 StopCoroutine(“协程方法名“); 对于一些有参数的协程,也可以这样做: 开启协程 Coroutine c=StartCoroutine(“协程方法名“); 关闭协程 StopCoroutine(c); IEnumerator 是C#的一个迭代器,你可以把它当成 指向一个序列的某个节点的指针 ,它提供了两个重要的接口,分别是Current(返回当前指向的元素)和 MoveNext()(将指针向前移动一个单位,如果移动成功,则返回true) yield 就是这个协程方法里起到协程作用的重要关键字,就是它将这个方法挂起,后面跟不同的东西会有不同的含义,目前常见如下: yiled return 0: 0可以换成任意的int类型的值,都是当前暂停一帧,从下一帧开始执行 yield return new WaitForSeconds(sec): 即这个协程方法挂起等待sec秒的时间 yield return StartCoroutine

进程、线程、协程之概念理解+线程和进程各自有什么区别和优劣

给你一囗甜甜゛ 提交于 2020-03-10 06:09:31
一、概念 首先,根据图了解一下串行,并行和并发的基本概念:   1、进程    资源分配的基本单位 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 Linux系统函数fork()可在父进程中创建一个子进程,在父进程接到新请求时,复制出一个子进程来处理,即父进程监控请求,子进程处理,实现并发处理。注意:必须是Linux系统,windows不能用fork。 组成 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 特征 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的

go select详解

岁酱吖の 提交于 2020-03-09 11:43:43
1. 前言 select是Golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready(即是否可读或可写), 使用起来非常方便。 本章试图根据源码总结其实现原理,从而发现一些使用误区或解释一些不太常见的现象。 2. 热身环节 我们先看几个题目,用于测试对select的了解程度,每个题目代表一个知识点,本章后面的部分会进行略为详细的介绍。 2.1 题目1 下面的程序输出是什么? package main import ( "fmt" "time" ) func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { chan1 <- 1 time.Sleep(5 * time.Second) }() go func() { chan2 <- 1 time.Sleep(5 * time.Second) }() select { case <-chan1: fmt.Println("chan1 ready.") case <-chan2: fmt.Println("chan2 ready.") default: fmt.Println("default") } fmt.Println("main exit.") } 程序中声明两个channel,分别为chan1和chan2