greenlet

Python 中多进程、多线程、协程

有些话、适合烂在心里 提交于 2021-02-15 06:29:23
进程:   一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享、开销大。 线程:   调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大的提高了程序的运行效率。 协程:   是一种用户态的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈,协程调度切换时。将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器和上下文和栈,直接操作栈基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。 什么时线程竞争?   线程时非独立的,同一个进程里线程是数据共享的,当各个线程方位数据资源时会出现竞争状态即:       数据几乎同步会被多个线程占用,造成数据混乱,即所谓的线程不安全,那怎么解决多线程竞争问题? -- 锁  锁的好处:     确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整的执行能解决多线竞争下的原子操作问题。  锁的坏处:        阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率大大的降低了,锁的致命问题:死锁。 多进程:   在Linux系统下,使用 os.fork(), 调用一次,返回两次

python 多线程, 多进程, 协程

不打扰是莪最后的温柔 提交于 2021-02-14 14:31:10
1. 介绍: threading 用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。 2. 1 线程执行函数 # !/bin/python # coding:utf8 import threading import time def action(arg): time.sleep( 1 ) print " this ia arg %s \n " % arg thread_list = [] for i in xrange(4 ): t = threading.Thread(target=action,args= (i,)) t.start() thread_list.append(t) for t in thread_list: t.join() print ' main end ' # coding:utf-8 import threading import time gl_num = 0 lock = threading.RLock() # 调用acquire([timeout])时,线程将一直阻塞, # 直到获得锁定或者直到timeout秒后(timeout参数可选)。 # 返回是否获得锁。 def Func(): lock.acquire() global gl_num gl

Gevent简明教程

廉价感情. 提交于 2021-01-02 07:05:46
Gevent简明教程 发表于 2015-11-28 | 分类于 技术 | | 阅读次数 5159 前述 进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库 多线程编程python中有Thread和threading 异步编程在linux下主+要有三种实现select,poll,epoll 协程在python中通常会说到yield,关于协程的库主要有greenlet,stackless,gevent,eventlet等实现。 进程 不共享任何状态 调度由操作系统完成 有独立的内存空间(上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息,开销大) 通讯主要通过信号传递的方式来实现(实现方式有多种,信号量、管道、事件等,通讯都需要过内核,效率低) 线程 共享变量(解决了通讯麻烦的问题,但是对于变量的访问需要加锁) 调度由操作系统完成(由于共享内存,上下文切换变得高效) 一个进程可以有多个线程,每个线程会共享父进程的资源(创建线程开销占用比进程小很多,可创建的数量也会很多) 通讯除了可使用进程间通讯的方式,还可以通过共享内存的方式进行通信(通过共享内存通信比通过内核要快很多) 协程 调度完全由用户控制 一个线程(进程

python 多进程、多线程、协程

删除回忆录丶 提交于 2020-12-20 04:12:13
1、python的多线程   多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有一个线程被执行。   多线程的特点:     线程比进程更轻量级,创建一个线程要比创建一个进程快10-100倍。     线程共享全局变量。     由于GIL的原因,当一个线程遇到IO操作时,会切换到另一个线程,所以线程适合IO密集型操作。     在多核cpu系统中,最大限度的利用多核,可以开启多个线程,开销比进程小的多,但是这并不适合python。   多线程互斥锁:     因为线程共享全局变量,所以需要互斥锁去限制线程对全局变量的更改。     假设,当一个线程在执行到获取全局变量的时候,这个后GIL切换到另一个线程执行,这个时候新的线程为全局变量+1后切换回之前的线程,之前的线程中的全局变量还是+1前的值,所以需要互斥锁。   为什么有了GIL锁还要互斥锁呢?     GIL锁只是控制同一时刻下只有一个线程被执行,这并不能控制同一时刻只有一个线程去获取并更改全局变量,所以需要使用互斥锁。   多线程的实现: # 导入threading模块 import threading # 定义全局变量 i= 0 # 定义互斥锁 mutex = threading.Lock()

D10——C语言基础学PYTHON

 ̄綄美尐妖づ 提交于 2020-12-13 21:44:57
C语言基础学习PYTHON——基础学习D10 20180906内容纲要:   1、协程      (1)yield     (2)greenlet     (3)gevent     (4)gevent实现单线程下socket多并发   2、简单爬虫   3、select   4、IO多路复用   5、小结   6、练习 1 协程 协程 又叫微线程,纤程。协程是一种用户态的轻量级线程。 协程有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文、和栈保存到其他地方,在切换回来的时候回复先前保存的寄存器上下文和栈。 协程能保存上一次调用时的状态。一个cpu支持上万个协程都不是问题,很适合用于高并发处理。 协程的本质就是单线程。无法利用多核资源。 实现协程主要有以下几种方式: (1)yield 1 # Author:ZhangKanghui 2 3 4 def Producer(): 5 r = con1. __next__ () 6 r = con2. __next__ () 7 n = 0 8 while n < 5 : 9 n += 1 10 con1.send(n) 11 con2.send(n) 12 print ( " \033[32;1m[Producer]\033[0m is making baozi %s " % n) 13 14 def Consumer(name

python网络编程(进程与多线程)

梦想的初衷 提交于 2020-08-17 00:00:14
multiprocessing模块   由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。   multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。   此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。   multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。   Process类的介绍 Process(target = talk,args = (conn,addr)) #

总结 90 条写 Python 程序的建议 用“强迫症”维持代码质量

筅森魡賤 提交于 2020-08-15 17:39:39
阅读本文大概需要 3 分钟。 ” 本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我删除。 自己写 Python 也有四五年了,一直是用自己的“强迫症”在维持自己代码的质量。都有去看 Google 的 Python 代码规范,对这几年的工作经验,做个简单的笔记,如果你也在学 Python,准备要学习 Python,希望这篇文章对你有用。 1. 首先 建议1、理解 Pythonic 概念—-详见 Python 中的《Python之禅》 建议2、编写 Pythonic 代码 (1)避免不规范代码,比如只用大小写区分变量、使用容易混淆的变量名、害怕过长变量名等。有时候长的变量名会使代码更加具有可读性。 (2)深入学习 Python 相关知识,比如语言特性、库特性等,比如Python演变过程等。深入学习一两个业内公认的 Pythonic 的代码库,比如Flask等。 建议3:理解 Python 与 C 的不同之处,比如缩进与 {},单引号双引号,三元操作符?, Switch-Case 语句等。 建议4:在代码中适当添加注释 建议5:适当添加空行使代码布局更加合理 建议6:编写函数的 4 个原则 (1)函数设计要尽量短小,嵌套层次不宜过深 (2)函数声明应该做到合理、简单、易用 (3)函数参数设计应该考虑向下兼容 (4)一个函数只做一件事,尽量保证函数粒度的一致性 建议7

总结了 90 条写 Python 程序的建议

别说谁变了你拦得住时间么 提交于 2020-08-14 03:24:43
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 来源丨 恋习Python https://mp.weixin.qq.com/s/6Oy0IzWepqILG0VSbLTczw 本文于网络整理,版权归原作者所有 这是一名5年经验的 Python小伙伴总结的90条python建议,如果你也在学pythpn,准备要学习python,希望这篇文章对你有用。 1. 首先 建议1、理解Pythonic概念—-详见Python中的《Python之禅》 建议2、编写Pythonic代码 (1)避免不规范代码,比如只用大小写区分变量、使用容易混淆的变量名、害怕过长变量名等。有时候长的变量名会使代码更加具有可读性。 (2)深入学习Python相关知识,比如语言特性、库特性等,比如Python演变过程等。深入学习一两个业内公认的Pythonic的代码库,比如Flask等。 建议3:理解Python与C的不同之处,比如缩进与{},单引号双引号,三元操作符?,Switch-Case语句等。 建议4:在代码中适当添加注释 建议5:适当添加空行使代码布局更加合理 建议6:编写函数的4个原则 (1)函数设计要尽量短小,嵌套层次不宜过深 (2)函数声明应该做到合理、简单、易用 (3)函数参数设计应该考虑向下兼容

编写高质量代码 改善 Python 程序的 91 个建议

雨燕双飞 提交于 2020-08-10 22:42:42
本文内容全部由 Python 编码的最佳实践组成,从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化 8 个方面深入探讨了编写高质量 Python 代码的技巧与禁忌,一共总结出 91 条宝贵的建议。每条建议对应 Python 程序员可能会遇到的一个问题。 建议1:理解Pythonic概念 建议2:编写Pythonic代码 建议3:理解Python与C语言的不同之处 建议4:在代码中适当添加注释 建议5:通过适当添加空行使代码布局更为优雅、合理 建议6:编写函数的4个原则 建议7:将常量集中到一个文件 建议8:利用assert语句来发现问题 建议9:数据交换值的时候不推荐使用中间变量 建议10:充分利用Lazy evaluation的特性 建议11:理解枚举替代实现的缺陷 建议12:不推荐使用type来进行类型检查 建议13:尽量转换为浮点类型后再做除法 建议14:警惕eval()的安全漏洞 建议15:使用enumerate()获取序列迭代的索引和值 建议16:分清=与is的适用场景 建议17:考虑兼容性,尽可能使用Unicode 建议18:构建合理的包层次来管理module 建议19:有节制地使用from…import语句 建议20:优先使用absolute import来导入模块 建议21:i+=1 不等于 ++i 建议22:使用with自动关闭资源 建议23

Python基础之(并发编程)

安稳与你 提交于 2020-05-08 08:24:48
一、进程 1.1、什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是 操作系统 结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,而进程是程序的实体。 狭义定义:进程是正在运行的程序的实例 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是 操作系统 动态执行的 基本单元 ,在传统的 操作系统 中,进程既是基本的 分配单元 ,也是基本的执行单元 1.2、并发与并行 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU ) 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率(一种是伪并行,cpu多道技术IO切换;另一种就是并行,具备多个cpu) 1.3、同步、异步,阻塞、非阻塞 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列 。要么成功都成功,失败都失败,两个任务的状态可以保持一致; 异步是指不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作