python协程

多线程与多进程的理解

匿名 (未验证) 提交于 2019-12-03 00:40:02
参考https://www.liaoxuefeng.com/ 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 在 Unix / Linux 下,可以使用 fork ()调用实现多进程。 要实现跨平台的多进程,可以使用 multiprocessing 模块。 进程间通信是通过 Queue 、 Pipes 等实现的 多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。 因为 Python 的线程虽然是真正的线程,但解释器执行代码时,有一个 GIL 锁: Global Interpreter Lock ,任何 Python 线程执行前,必须先获得 GIL 锁,然后,每执行 100 条字节码,解释器就自动释放 GIL 锁,让别的线程有机会执行。这个 GIL 全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在 Python 中只能交替执行,即使 100 个线程跑在 100 核 CPU 上,也只能用到 1 个核。 不过,也不用过于担心,

点读系列《流畅的python》

我只是一个虾纸丫 提交于 2019-12-03 00:13:41
第1章 python数据模型 python的写法是由背后的魔法方法实现的,比如obj[key],解释器实际调用的是obj.__getitem__(key) 作者把魔法方法叫做双下方法,因为有两个下划线 collections.namedtuple可以用来创建只有少数属性但没有方法的对象,比如 beer_card = Card('7', 'diamonds') random.choice和random.sample不一样的地方在于,sample是返回序列,choice是返回元素,当使用sample(list, 1)[0]的时候,不如直接使用choice(list) deck[12::13],是指先抽出索引是12的那张牌,然后每向后数13张牌拿一张 实现了__getitem__让对象变得可迭代了 sorted(deck, key=spades_high) python sorted函数 suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) def spades_high(card): rank_value = FrenchDeck.ranks.index(card.rank) return rank_value * len(suit_values) + suit_values[card.suit]

Python协程,完美掌握!

匿名 (未验证) 提交于 2019-12-02 22:51:30
声明:本人的一切著作,禁止用于以营销为目的的任何转载! 前言 很久以前就听说 Python 的 async/await 很厉害,但是直到现在都没有用过,一直都在用多线程模型来解决各种问题。最近看到隔壁的 Go 又很火,所以决定花时间研究下 Python 协程相关的内容,终于在翻阅了一裤衩的资料之后有了一些理解。 起:一切从生成器开始 以往在 Python 开发中,如果需要进行并发编程,通常是使用多线程 / 多进程模型实现的。由于 GIL 的存在,多线程对于计算密集型的任务并不十分友好,而对于 IO 密集型任务,可以在等待 IO 的时候进行线程调度,让出 GIL,实现『假并发』。 当然对于 IO 密集型的任务另外一种选择就是协程,协程其实是运行在单个线程中的,避免了多线程模型中的线程上下文切换,减少了很大的开销。为了理解协程、async/await、asyncio,我们要从最古老的生成器开始。 回顾 Python 的历史,生成器这个概念第一次被提出的时候是在PEP 255中被提出的,当时的 Python 版本为 Python2.2。我们都知道range()函数,现在考虑一下我们来编写一个自己的range()函数,最直接最容易想到的方法也许是这样: 当你想创建一个很小的序列的时候,例如创建从 0 到 100 这样的列表,似乎没什么问题。但是如果想创建一个从 0 到 999999999

python基础面试题(全网最全!)

匿名 (未验证) 提交于 2019-12-02 22:51:30
Ŀ¼ 1、为什么学习Python? 1、为什么学习Python? 人生苦短....哈哈,自己想吧!!! emmm。。。来真的 python语言的简洁、优美! 官网、网上视频、学习网站 1、python代码,简介,明确,优雅,简单易懂 2、开发效率高 3、可扩展性强 解释型:在执行程序时,计算机才一条一条的将代码解释成机器语言给计算机来执行 编译型:是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样计算机运行该程序时可以直接以机器语言来运行此程序,运行速度很快。 Cpython,IPython,Jpython,pypy,Ironpython Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的五种Python解释器: CPython:当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解 释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python, 就是启动CPython解释器,CPython是使用最广的Python解释器。 IPython:IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方 式上有所增强

Python连载42-异步协程函数

匿名 (未验证) 提交于 2019-12-02 22:51:30
1.python3.4开始引入标准库之中,内置对异步io的支持 2.asyncio本身是一个消息循环 3.步骤: (1)创建消息循环 (2)把协程导入 (3)关闭 4.举例: import threading #引入异步io包 import asyncio #使用协程 @asyncio.coroutine def hello(): print("Hello World!(%s)"%threading.current_thread()) print("Start......(%s)"%threading.current_thread()) yield from asyncio.sleep(5) print("Done.....(%s)"%threading.current_thread()) print("Hello again!(%s)"%threading.current_thread()) #启动消息循环 loop = asyncio.get_event_loop() #定义任务 tasks = [hello(),hello()] #asyncio使用wait等待task执行完毕 loop.run_until_complete(asyncio.wait(tasks)) #关闭消息循环 loop.close() 二、asyncio and await 1.为了更好的表示异步io

Python连载38-协程、可迭代、迭代器、生产者消费者模型

匿名 (未验证) 提交于 2019-12-02 22:51:30
一、生产者消费者模型 import multiprocessing from time import ctime def consumer ( input_q ): print ( "Into consumer:" , ctime ()) while True : #处理项 item = input_q . get () print ( "pull" , item , "out of q" )#此处替换为有用的工作 input_q . task_done ()#发出信号通知任务完成 print ( "Out of consumer:" , ctime ()) #此句未执行,因为q.join()收集到四个task_done()信号后,主进程启动 def producer ( sequence , output_q ): print ( "Into producer:" , ctime ()) for item in sequence : output_q . put ( item ) print ( "put" , item , "into_q" ) print ( "Out of producer:" , ctime ()) #建立进程 if __name__ == "__main__" : q = multiprocessing . JoinableQueue ()

python之路4:各种器

匿名 (未验证) 提交于 2019-12-02 22:51:30
语法:   def wrapper(func): def result(): print('before') func() print('after') return result @wrapper def foo(): print('foo') 实例: #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = 'lvlibing' import time def timer(func): #timer(test1) func = test1 def deco(*args,**kwargs): start_time = time.time() func(*args,**kwargs) #run test1() stop_time = time.time() print('the func run time is %s' %(start_time - stop_time)) return deco @timer # test1 = timer(test1) def test1(): time.sleep(1) print('in the test1') @timer # test2 =timer(test2) = deco test2(name) = deco(name) def test2(name,age):

python_高级进阶(5)协程_事件

匿名 (未验证) 提交于 2019-12-02 22:51:30
import queue q = queue . Queue ( 3 ) q . put ( 1 ) q . put ( 2 ) q . put ( 3 ) q . put ( 4 ) print ( q . get ()) print ( q . get ()) print ( q . get ()) print ( q . get ( block = False )) q . get ( timeout = 2 ) # 阻塞2s 还没有值直接报错 结果: #1 #2 #3 ##第二种、后进先出 Lifo 堆栈 q = queue . LifoQueue ( 4 ) q . put ( 1 ) q . put ( 2 ) q . put ( 'alex' ) q . put ( '太白' ) print ( q . get ()) print ( q . get ()) print ( q . get ()) print ( q . get ()) 结果: 太白 alex 2 1 q = queue . PriorityQueue ( 4 ) q . put (( 5 , '元宝' )) q . put ((- 2 , '狗狗' )) q . put (( 0 , '李业' )) print ( q . get ()) print ( q . get ()) print ( q

python多任务――协程的使用

匿名 (未验证) 提交于 2019-12-02 22:51:30
import time def test1(): while True: print("--1--") time.sleep(0.5) yield None def test2(): while True: print("--2--") time.sleep(0.5) yield None if __name__ == "__main__": t1 = test1() t2 = test2() while True: next(t1) next(t2) 如果没有安装,则 pip install greenlet 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.switch() 首先使用 pip install gevent 进行安装 gevent是对greenlet的再次封装,使用起来更加简便,当有耗时操作时会自动切换到其他协程。gevent封装了常用的耗时操作

python之 yield --- “协程”

匿名 (未验证) 提交于 2019-12-02 22:51:30
在编程中我们经常会用到列表,以前使用列表时需要声明和初始化,在数据量比较大的时候也需要把列表完整生产出来,例如要存放1000给数据,需要准备长度1000的列表,这样计算机就需要准备内存放置这个列表,在Python中,这种一边循环一边计算的机制,称为生成器:generator,这个功能在列表使用时比较节省空间,使用方法: g=(i*2 for i in range(10)) data=g.__next__() print(d) 取列表时data=g.__next__(),此时才去生成。 应用:生成斐波拉契数列 def fig(num): n,a,b=0,0,1 while n<num: yield b a,b=b,a+b n+=1 return 'done' fig(10) 定义长度为10的数列 fig(10) for i in range(10): try: x=next(g) print(x) except StopIteration as e: print('error %s' % e.value) break 运行结果: 1 1 2 3 5 8 13 21 34 55 这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用 next() 的时候执行,遇到