① python协程gevent怎么用
在学习gevent之前,你肯定要知道你学的这个东西是什么。
官方描述gevent
gevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev event loop.
翻译:gevent是一个基于协程的Python网络库。我们先理解这句,也是这次学习的重点——协程。
wiki描述协程
与子例程一样,协程也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。子例程的起始处是惟一的入口点,一旦退出即完成了子例程的执行,子例程的一个实例只会返回一次;协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的。协程允许多个入口点,可以在指定位置挂起和恢复执行。
没看懂?没关系,我也没看懂,不过算是有点线索:子例程。
子例程
过程有两种,一种叫子例程(Subroutine),通常叫Sub;另一种叫函数(Function)。底层实现机制是一样的,区别在于,Sub只执行操作,没有返回值;Function不但执行操作,并且有返回值。用过VB的应该会比较清楚这点。(原谅我用了网络)说到底子例程就是过程,我们一般叫它函数。
说到函数,我就想吐槽了,不明白为什么要叫函数。很多时候我们写一个函数是为了封装、模块化某个功能,它是一个功能、或者说是一个过程。因为它包含的是类似于流程图那样的具体逻辑,先怎样做,然后怎样做;如果遇到A情况则怎样,如果遇到B情况又怎样。个人觉得还是叫过程比较好,叫做函数就让人很纠结了,难道因为回归到底层还是计算问题,出于数学的角度把它称为函数?这个略坑啊!为了符合大家的口味,我还是称之为函数好了(其实我也习惯叫函数了%>_
讲到函数,我们就往底层深入一点,看看下面的代码:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def a():
print "a start"
b()
print "a end"
def b():
print "b start"
c()
print "b end"
def c():
print "c start"
print "c end"
if __name__ == "__main__":
a()
a start
b start
c start
c end
b end
a end
对于这样的结果大家肯定不会意外的。每当函数被调用,就会在栈中开辟一个栈空间,调用结束后再回收该空间。
假设一个这样的场景:有个讲台,每个人都可以上去发表言论,但是每次讲台只能站一个人。现在a在上面演讲,当他说到“大家好!”的时候,b有个紧急通知要告诉大家,所以a就先下来让b讲完通知,然后a再上讲台继续演讲。如果用函数的思想模拟这个问题,堆栈示意图是这样的:
那什么东西有这样的能力呢?我们很快就可以想到进程、线程,但是你真的想使用进程、线程如此重量级的东西在这么简单的程序上吗?野蛮的抢占式机制和笨重的上下文切换!
还有一种程序组件,那就是协程。它能保留上一次调用时的状态,每次重新进入该过程的时候,就相当于回到上一次离开时所处逻辑流的位置。协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。协程的生命期完全由他们的使用的需要决定。每个协程在用yield命令向另一个协程交出控制时都尽可能做了更多的工作,放弃控制使得另一个协程从这个协程停止的地方开始,接下来的每次协程被调用时,都是从协程返回(或yield)的位置接着执行。
从上面这些你就可以知道其实协程是模拟了多线程(或多进程)的操作,多线程在切换的时候都会有一个上下文切换,在退出的时候将现场保存起来,等到下一次进入的时候从保存的现场开始,继续执行。
看下协程是怎样实现的:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import random
from time import sleep
from greenlet import greenlet
from Queue import Queue
queue = Queue(1)
@greenlet
def procer():
chars = ['a', 'b', 'c', 'd', 'e']
global queue
while True:
char = random.choice(chars)
queue.put(char)
print "Proced: ", char
sleep(1)
consumer.switch()
@greenlet
def consumer():
global queue
while True:
char = queue.get()
print "Consumed: ", char
sleep(1)
procer.switch()
if __name__ == "__main__":
procer.run()
consumer.run()
应用场景
我们一直都在大谈协程是什么样一个东西,却从没有提起协程用来干嘛,这个其实大家分析一下就能够知道。从上面的生产者——消费者问题应该能看出,它分别有两个任务,假设交给两个人去执行,但每次只能允许一个人行动。当缓冲区满的时候,生产者是出于等待状态的,这个时候可以将执行任务的权利转交给消费者,当缓冲区空得时候,消费者是出于等待状态的,这个时候可以将执行任务的权利转交给生产者,是不是很容易联想到多任务切换?然后想到线程?最后想到高并发?
但同学们又会问,既然有了线程为什么还要协程呢?因为线程是系统级别的,在做切换的时候消耗是特别大的,具体为什么这么大等我研究好了再告诉你;同时线程的切换是由CPU决定的,可能你刚好执行到一个地方的时候就要被迫终止,这个时候你需要用各种措施来保证你的数据不出错,所以线程对于数据安全的操作是比较复杂的。而协程是用户级别的切换,且切换是由自己控制,不受外力终止。
总结
协程其实模拟了人类活动的一种过程。例如:你准备先写文档,然后修复bug。这时候接到电话说这个bug很严重,必须立即修复(可以看作CPU通知)。于是你暂停写文档,开始去填坑,终于你把坑填完了,你回来写文档,这个时候你肯定是接着之前写的文档继续,难道你要把之前写的给删了,重新写?这就是协程。那如果是子例程呢?那你就必须重新写了,因为退出之后,栈帧就会被弹出销毁,再次调用就是开辟新的栈空间了。
总结:协程就是用户态下的线程,是人们在有了进程、线程之后仍觉得效率不够,而追求的又一种高并发解决方案。为什么说是用户态,是因为操作系统并不知道它的存在,它是由程序员自己控制、互相协作的让出控制权而不是像进程、线程那样由操作系统调度决定是否让出控制权。
② 如何用python写生命游戏(Game of Life)
搜索一下有很多啦
http://plife.sourceforge.net/
http://www.daniweb.com/code/snippet217028.html#
③ Python培训机构哪个好
人工智能时代来临,未来十年,人工智能是未来的趋势。哪个编程语言最适合人工智能人,当然首选python,前景非常好,无论你现在是一个程序员,还是想转行IT学编程,python都是一个不错的选择。最好选择培训“人工智能+python”,并且在IT行业运营了很多年,口碑非常不错的机构。
④ 小白学python怎么快速入门多久能完成一个项目
电子书集合|数据科学速查表|迁移学习实战 ,免费下载
链接: https://pan..com/s/11qnpoLX1H_XzFB-RdVNG4w 提取码: z9x7
⑤ 一个老师带着25个学生去划船,每条船最多坐4人,用python编写程序问需要多少条
25//4+int(25%4!=0)
⑥ python函数中仅允许使用一条return语句吗为什么
如果函数执行了return语句,那么函数的生命就结束了,return 语句后面的代码都不会执行。所以准确的说,函数里只能执行一次return语句,但可以写多条return语句。比如这样:
deftest_return(x):
ifx>0:
returnx
else:
return0
⑦ python生命周期怎么设置
第一部分
最近在写Python的时候发现一个好玩的现象,就是在if else重定义的变量,没有声明全局,在外部也可以使用,
这里涉及到一个python变量生命周期的问题。
python能够改变变量作用域的代码段是def、class、lamda.
if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,
也就是说他们的代码块中的变量,在外部也是可以访问的
变量搜索路径是:本地变量->全局变量
⑧ 想学python从哪里入手
Python适用于网站、桌面应用开发,自动化脚本,复杂计算系统,科学计算,生命支持管理系统,物联网,游戏,机器人,自然语言处理等很多方面。而且,既使对于那些从没有开发经验的人来讲,Python的代码也是简洁易懂的。所以,有不少人会选择Python专业的学习。
作为一门优美、精巧的编程语言,Python不仅仅适合作为编程入门,对于希望掌握实战开发技能进而从事编程工作的人来说,Python也是一个很不错的选择。
Python的初学者说一说入门的学习路径。
1、建立开发环境
建立开发环境非常重要,。做任何开发,首先就是要把这个环境准备好,之后就可以去做各种尝试,尝试过程中的话就能逐渐建立信心。初学者往往在环境配置中被各种预想不到的问题弄得很沮丧。
2、了解编程语言基础
有了工作环境后,我们就可以开始编写和执行Python程序了。
Python这类脚本程序其实就像是一段“电影脚本”,按照从前往后的顺序规定了一系列的动作,指挥着你电脑的CPU、硬盘、操作系统等部件干这干那。所以为了让电脑能够看懂,你编写的这段“电影脚本”需要按照电脑所使用的语言进行编写。例如print("hello world!")这样一句话就会让电脑调用一系列部件,最后在屏幕上输出它对世界的问好;而a=3+5这样一句话就会让电脑计算3+5的答案,然后将答案放入一个名字为a的“盒子”当中。
3、掌握数据结构基础
为了能够完成更复杂的计算场景,Python提供了若干种内置的数据结构。所谓数据结构,你可以认为一组变量以某个特定的方式组织在一起,而不仅仅是单个独立的变量。通过特定的组织方式,在处理某些运算时能够能够大大提高编程的效率。数据结构是计算机专业的一门必修专业课,更高级的数据结构及其内部实现方式你需要专门学习,不过Python的数据结构可以是一个非常好的学习起点。
4、掌握函数的基本概念
在实际编写程序的过程中,某些代码可能会反复执行多次。而这些代码除了变量不同外,没有任何的区别。这些代码实际上类似于数学表达式中的函数f(x),当我们给x赋值时,就会得到对应的结果。在Python中也提供了这样的特性,同样称之为“函数”。
函数将需要反复使用的代码进行模块化,从而减少了代码的重复,同时还增加了可读性和可维护性。当需要修改时,只要改变定义内的代码,就可以完成对每一次执行的修改。
5、面向对象编程
面向对象是一种非常符合人类思维的编程方法,因为现实世界就是由对象和对象之间的交互来构成的,所以我们其实很容易将现实世界映射到软件开发中。举个例子,一辆汽车、一篇博客、一个人,对应到软件系统中都是一个对象;而对象具有自己的状态和行为。
6、学习函数式编程
也许你还觉得函数式编程很陌生,但许多的函数式编程风格已经渐渐开始流行。什么叫函数式编程呢?事实上只要语言将函数作为一等公民(或者借助工具达到类似效果) 就可以支持函数式编程。而将函数作为一等公民意味着函数可以像变量一样传参、赋值和返回。函数式编程的书写方式使得代码编写的效率更加高,极大地提高生产效率。
7、掌握更多标准库中的模块
⑨ 用python语言编写程序,解决问题:一个老师带着25个学生去划船,每条船做4个人,问需要多少条船
import math
print(ceil((25+1)/4))
# ceil函数:返回不小于指定值的最小整数。
⑩ Python是什么
也许最初设计Python这种语言的人并没有想到今天Python会在工业和科研上获得如此广泛的使用。着名的自由软件作者Eric Raymond在他的文章《如何成为一名黑客》中,将Python列为黑客应当学习的四种编程语言之一,并建议人们从Python开始学习编程。这的确是一个中肯的建议,对于那些从来没有学习过编程或者并非计算机专业的编程学习者而言,Python是最好的选择之一。Python第一次学习Python,我只用了不到二十分钟的时间,站在书店里把一本教初学编程的人学习Python的书翻了一遍。也是从那时起,我开始被这种神奇的语言吸引。 Python可以用来开发symbian上的东西。 易用与速度的完美结合Python是一种用起来很方便的语言,很多初学Java的人都会被Java的CLASSPATH搞得晕头转向,花上半天的时间才搞明白原来是CLASSPATH搞错了自己的Hello World才没法运行。用Python就不会有这种问题,只要装上就能直接用。 Python是一种脚本语言,写好了就可以直接运行,省去了编译链接的麻烦,对于需要多动手实践的初学者而言,也就是少了出错的机会。而且Python还有一种交互的方式,如果是一段简单的小程序,连编辑器都可以省了,直接敲进去就能运行。Python是一种清晰的语言,用缩进来表示程序的嵌套关系可谓是一种创举,把过去软性的编程风格升级为硬性的语法规定。再不需要在不同的风格间选择、再不需要为不同的风格争执。与Perl不同,Python中没有各种隐晦的缩写,不需要去强记各种奇怪的符号的含义。Python写的程序很容易懂,这是不少人的共识。Python是一种面向对象的语言,但它的面向对象却不象C++那样强调概念,而是更注重实用。不是为了体现对概念的完整支持而把语言搞得很复杂,而是用最简单的方法让编程者能够享受到面向对象带来的好处,这正是Python能像Java、C#那样吸引众多支持者的原因之一。 Python是一种功能丰富的语言,它拥有一个强大的基本类库和数量众多的第三方扩展,使得Python程序员无需去羡慕Java的JDK。Python为程序员提供了丰富的基本功能使得人们写程序时用不着一切最底层做起。说到这里,人们通常会用一种担心:脚本语言通常很慢。脚本语言从运行的速度讲的确会慢一些,但Python的速度却比人们想象得快很多。虽然Python是一种脚本语言,但实际上也可以对它进行编译,就象编译Java程序一样将Python程序编译为一种特殊的ByteCode,在程序运行时,执行的是ByteCode,省去了对程序文本的分析解释,速度自然提升很多。在用Java编程是,人们崇尚一种Pure Java的方式,除了虚拟机一切东西都用Java编写,无论是基本的数据结构还是图形界面,而Pure Java的SWING,却成为无数Java应用开发者的噩梦。Python崇尚的是实用,它的整体环境是用C来编写的,很多基本的功能和扩展的模块都是用C/C++来编写的,当执行这一部分代码时,它的速度就是C的速度。用Python编写的普通桌面程序,其启动运行速度与用C写的程序差别不大。除了这些,通过一些第三方软件包,用Python编写的源代码还可以以类似JIT的方式运行,而这可以大大提高Python代码的运行速度,针对不同类型的代码,会有2倍至100倍不等的速度提升。 Python是我见到过的语言中,在易用性和速度上结合的最完美的一个,通过丧失一点点经常可以忽略不计的运行速度从而获得更高的编程效率,这就是我选择Python的原因。把精力放在要解决的问题上选择一种合适的语言,才能让你把有限的精力放到最需要解决的问题上。不同的语言有不同的作用,C和汇编适合编写系统软件,如果用它们来编写企业应用,恐怕没几个人能得心应手。我以前就碰到一个用汇编写数据库程序的哥,虽然最基本的功能完成了,但要增加个报表预览什么的,他就没法应付了。聪明的程序员是用合适的工具去完成任务,想找一把万能钥匙是不太可能的。Python的自动的垃圾回收机制是高级的编程语言的一种基本特性,用拥有这一功能的语言编程,程序员们通常不用去关心内存泄漏的问题,而当我们用C/C++写程序时,这却是最重要的需要认真考虑却又很容易出错的问题之一。数据结构是程序构成的重要部分,链表、树、图这些在用C编程时需要仔细表达的问题在Python中简单了很多。在Python中,最基本的数据结构就是数组、序列和哈希表,用它们想要表达各种常见的数据结构是非常容易的。没了定义指针、分配内存的任务,编程变得有趣了。CORBA是一种高级的软件体系结构,它是语言无关平台无关的。C++、Java等语言都有CORBA绑定,但与它们相比,Python的CORBA绑定却容易很多,因为在程序员看来,一个CORBA的类和Python的类用起来以及实现起来并没有什么差别。没了复杂体系结构的困扰,用Python编写CORBA程序也变得容易了。好钢要用在刀刃上,要想用有限的时间完成尽量多的任务,就要把各种无关的问题抛弃,而Python恰恰提供了这种方法。跨平台又易扩展随着Linux的不断成熟,越来越多的人转到Linux平台上工作,软件的开发者自然就希望自己编写的软件可以在所有平台下运行。Java一次编写处处运行的口号使它成为跨平台的开发工具的典范,但其运行速度却不被人们看好。实际上,几乎所有的着名脚本语言都是跨平台的,Python也不例外。Python不仅支持各种Linux/Unix系统,还支持Windows,甚至在Palm上都可以运行Python的程序。一个程序想要跨平台工作,不仅仅需要语言本身能够做到在平台之间兼容,在图形化界面的时代,还需要有能跨平台工作的Widget。Python不仅支持老一些的TK,还支持新的GTK+、QT以及wxWidget,而这些Widgets都可以在多个平台上工作。通过它们,程序员就可以编写出漂亮的跨平台GUI程序。Python通常是运行在native代码与脚本代码之间,程序员可以用C/C++为Python编写各种各样的模块,这不仅可以让程序员以Python的方式使用系统的各种服务及用C/C++编写的优秀函数库和类库,还可以大幅度提高Python程序的速度。用C/C++编写Python的模块并不复杂,而且为了简化这一工作,人们还制作了不少工具用来协助这一工作。正是因为如此,现在各种常用的函数库和类库都有Python语言的绑定,用Python可以做到的事情越来越多了。万能钥匙?Python功能强大,但它却不是万能的。如果你要编写操作系统或驱动程序,很显然,Python是做不到的。要写软件,没有哪个工具是万能的,现在之所以有那么多的编程语言,就是因为不同的语言适合做不同的事情。因此,选择适合自己的语言工具是最重要的。