协程

重述协程

给你一囗甜甜゛ 提交于 2019-12-03 12:08:11
重述协程 之前知道的,可以开多进程,每个进程又可以开多线程,线程又可以开协程,多进程可以占用多个cpu的核,一个进程同时只能占用一个核,因为每个进程默认有一个主线程,由于存在GIL全局解释器锁,所以导致了多线程也只能占用一个核。 什么是协程? 协程就是把多个任务都放在一个线程下面跑,计算密集型没用,甚至更差,io密集型有用,他可以用模块自动实现在遇到io的时候再任务间切换,而不被操作系统发现,尽可能长时间的占用cpu。 什么时候用多进程? 有多核,而且任务是计算密集型的时候。这样可以并行的去执行这些任务,如果是io密集型的话,浪费了开启多进程的资源,因为io的时候cpu是不执行的。 什么时候用多线程? 需要对同一个内存空间进行操作时,io密集型任务。 什么时候用协程? 当任务是io密集型的时候。 为什么不用多线程而用协程? 1、因为协程的切换是在应用程序之间切换,和多线程的cpu的切换相比起来快得多。 2、协程是在一个线程下的,意味着他已经拿到了线程锁,比如这时候有三个一样的任务都是循环200000次 x = x+1 ,因为协程中任务之间的切换是遇到io才会切换的,所以在循环的时候不会切换,就算这个时候占用cpu时间过长,而导致cpu切换到其他线程上,协程也会保留当前的状态,下次cpu再切到这里的时候继续运行。(总而言之,不需要锁了) 3、尽可能让cpu停留在自己的线程上

进程、线程、协程三者之间的联系与区别

旧城冷巷雨未停 提交于 2019-12-03 12:02:20
进程、线程、协程三者之间的联系与区别 一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体 有自己独立的地址空间,有自己的堆 ,上级挂靠单位是操作系统。 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位 。 二、线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。 三、协程 协程是一种用户态的轻量级线程, 协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。 协程在子程序内部可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。 四、进程和线程的区别与联系 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。 系统开销: 多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些 。 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时

并发编程—协程

依然范特西╮ 提交于 2019-12-03 11:26:53
目录 1、什么是协程 2、使用协程的优缺点 3、实现协程的方法 3.1 模块greenlet 3.2 模块gevent 3.2.1 介绍 3.2.2 使用方法 3.2.3 同步与异步 3.2.4 应用举例 1、什么是协程 协程:是单线程下的并发,又称微线程,纤程。 协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调的是: 1、python的线程属于内核级别,即有操作系统控制调度(如单线程遇到i/o时间过长,就会被迫交出cpu执行权限,切换其他线程运行) 2、单线程内开启协程,一旦遇到i/o,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(特别注意:非i/o操作的切换与效率无关) 2、使用协程的优缺点 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点: 1、协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 2、单线程内就可以实现并发的效果,最大限度使用cpu 缺点: 1、协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内可以开启多个线程,每个线程内可以开启多个协程 2、协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程 总结协程特点: 1、必须在只有一个单线程里实现并发 2、修改共享数据不需要加锁 3、用户程序里自己保存多个控制流的上下文线 4

较为激进的基础框架

不想你离开。 提交于 2019-12-03 10:25:47
1. 使用 Roslyn 的动态编译修改语法树的方式支持高级语法. 让Unity5/Unity2017等能够支持到C# 7.3语法.   原理 : https://www.cnblogs.com/liuxiaoji/p/9875826.html   下载的网站不见了, 可能随着Unity支持的.Net库升级, 未来Unity也会支持到7的语法, 作者把这个项目关了吧   这个项目非常实用, 并且基本没有BUG, 用的飞起. 2. 使用await代码特性代替协程的方式 : http://www.stevevermeulen.com/index.php/2017/09/using-async-await-in-unity3d-2017/   目前看来额外的开销比较大, 实用性较低, 它实现的方式在底层仍然依赖了协程来实现原来协程的一些等待逻辑. 3. 尝试使用C#代码的动态解释方式作为热更新 : https://github.com/fcscript/https---github.com-fcscript-public   现在仍然不实用, 感觉因为它解释的代码只有堆栈功能, 没有运行环境......就像一个僵尸一样, 没有lua解决方案那样的运行环境构建. 4. 基于ECS的UI系统 : https://blog.uwa4d.com/archives/UWALab_DOTSUI

基于协程实现并发的套接字通信

给你一囗甜甜゛ 提交于 2019-12-03 07:46:52
服务端: from gevent import monkey,spawn;monkey.patch_all() from threading import Thread from socket import * def talk(conn): #跟建好的连接进行通讯 while True: try: data=conn.recv(1024) if not data:break conn.send(data.upper()) except ConnectionResetError: break conn.close() def server(ip,port,backlog=5): s = socket() s.bind((ip,port)) s.listen(backlog) while True: conn, addr = s.accept() #建连接 print(addr) # 通信 g=spawn(talk,conn) #提交一个协程任务,进行通讯。在多个客户端之间来回切换 #切的速度非常快,多个客户端都得到及时响应 s.close() if __name__ == '__main__': spawn(server,'127.0.0.1',8080).join() # server(('127.0.0.1',8080)) #和上面一步效果相同 客户端: from

聊聊C10K问题及解决方案

*爱你&永不变心* 提交于 2019-12-03 07:04:30
#0 系列目录# 聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出SOA思想 微服务、SOA 和 API对比与分析 聊聊同步、异步、阻塞与非阻塞 聊聊Linux 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 聊聊C10K问题及解决方案 #1 C10K问题# 大家都知道 互联网的基础就是网络通信 ,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当时已经算是大型应用了。所以并不存在什么C10K的难题。互联网的爆发期应该是在www网站,浏览器,雅虎出现后。最早的互联网称之为Web1.0,互联网大部分的使用场景是下载一个Html页面,用户在浏览器中查看网页上的信息。这个时期也不存在C10K问题。 Web2.0时代到来后就不同了,一方面是普及率大大提高了,用户群体几何倍增长。另一方面是互联网不再是单纯的浏览万维网网页,逐渐开始进行交互,而且应用程序的逻辑也变的更复杂,从简单的表单提交,到即时通信和在线实时互动。C10K的问题才体现出来了。 每一个用户都必须与服务器保持TCP连接才能进行实时的数据交互

线程,进程,协程基本理解

妖精的绣舞 提交于 2019-12-03 06:52:07
进程:计算机程序一次执行的实例,由程序数据段PCB组成,是计算机资源分配和调度的基本单位,也是线程的容器。 线程:线程也叫轻量级进程,是程序执行的最小单位,本身只拥有少部分执行必须的资源。 协程:·协程也叫微线程,用户可自己控制协程切换的时机,不再需要陷入系统的内核态。线程和进程都面临着内核态和用户态的切换问题,耗费许多切换时间。 区别: 1)线程共享内存空间,进程内存独立 2)线程之间可直接通信,进程间通信必须通过中间代理 3)同一进程的线程之间可以相互控制,但进程只能控制子进程 4)线程创建很简单,但创建新进程必须对父进程进行一次克隆 5)改变主线陈会影响其他线程,但改变父进程不会影响子进程 GIL:全局解释器锁,系统中同一时间点,只能有一个线程被解释器解释,无法做到并行,无法充分利用多核资源。 python所谓的多线程就类似于单核CPU情况下的多进程编程。 如何解决GIL锁的问题: 1)更换cpython为jpython 2)使用多进程执行多线程任务 3)通过C来实现多线程 互斥锁:多线程时,保证修改的数据为有序修改,不会产生数据修改混乱。 来源: https://www.cnblogs.com/zhanghaibin16/p/11781337.html

协程

六眼飞鱼酱① 提交于 2019-12-03 05:13:19
协程目的: 1 、 单线程下实现并发:协程 解决方案:一个任务运行的过程中把它打断(保存此时的状态)切换到另一个任务中,运行一段时间再切换回来,反复来回切换 注:并发指的是多个任务看起来是同时运行的   并发实现的本质:切换+保存状态   并发、并行、串行:   并发:看起来是同时运行,切换+保存状态   并行:真正意义上的同时运行,只有在多cpu情况下才实现并行,4个cpu能够并行4个任务   串行:一个任务完完整整地执行完毕才运行下一个任务 例如以下程序中生产者和消费者数据的来回切换:(应用程序自己控制切换及保存状态,速度更快) import time def consumer(): '''任务1:接收数据,处理数据''' while True: x=yield def producer(): '''任务2:生产数据''' g=consumer() next(g) for i in range(10000000): g.send(i) start=time.time() #基于yield保存状态,实现两个任务直接来回切换,即并发的效果 #PS:如果每个任务中都加上打印,那么明显地看到两个任务的打印是你一次我一次,即并发执行的. producer() #1.0202116966247559 stop=time.time() print(stop-start) View Code

150行代码搭建异步非阻塞Web框架

狂风中的少年 提交于 2019-12-03 04:33:48
最近看Tornado源码给了我不少启发,心血来潮决定自己试着只用python标准库来实现一个异步非阻塞web框架。花了点时间感觉还可以,一百多行的代码已经可以撑起一个极简框架了。 一、准备工作 需要的相关知识点: HTTP协议的请求和响应 IO多路复用 asyncio 掌握上面三个点的知识就完全没有问题,不是很清楚的同学我也推荐几篇参考文章   HTTP协议详细介绍( https://www.cnblogs.com/haiyan123/p/7777924.html )   Python篇-IO多路复用详解( https://www.jianshu.com/p/818f27379a5e )   Python异步IO之协程(一):从yield from到async的使用( https://blog.csdn.net/SL_World/article/details/86597738 ) 实验环境: python 3.7.3 由于在框架中会使用到async/await关键字,所以只要确保python版本在3.5以上即可。 二、框架功能目标 我们的框架要实现最基本的几个功能: 封装HTTP请求响应 路由映射 类视图和函数视图 协程支持 当然一个完善的web框架需要实现的远远不止这些,这里我们现在只需要它能跑起来就足够了。 三、封装HTTP协议 HTTP是基于TCP

python的协程例子:每次输入一个数字,然后计算出所有输入数字的平均值

空扰寡人 提交于 2019-12-03 04:31:19
#!/usr/bin/env python3 def mean_x(): s = 0.0 n = 0 while True: s += yield n+=1 print("s =", s, "n=", n) print("mean = ", s/n) x = mean_x() next(x) while True: print("please input number...") x.send(float(input())) 能写出类似的例子,就是理解协程了。 来源: CSDN 作者: 未济2019 链接: https://blog.csdn.net/u011539200/article/details/81039846