python异步框架
Ⅰ python里面哪些框架有
Django: Py Web应用开发框架
Diesel:基于Greenlet的事件I/O框架
Flask:一个用Py编写的轻量级回Web应用框架
Cubes:轻量级Py OLAP框架
Kartograph.py:创造矢答量地图的轻量级Py框架
Pulsar:Py的事件驱动并发框架
Web2py:全栈式Web框架
Falcon:构建云API和网络应用后端的高性能Py框架
Dpark:Py版的Spark
Buildbot:基于Py的持续集成测试框架
Zerorpc:基于ZeroMQ的高性能分布式RPC框架
Bottle: 微型Py Web框架
Tornado:异步非阻塞IO的Py Web框架
webpy: 轻量级的Py Web框架
Scrapy:Py的爬虫框架
Ⅱ python异步有哪些方式
yield相当于return,他将相应的值返回给调用next()或者send()的调用者,从而交出了CPU使用权,而当调用者再次调用next()或者send()的时候,又会返回到yield中断的地方,如果send有参数,还会将参数返回给yield赋值的变量,如果没有就和next()一样赋值为None。但是这里会遇到一个问题,就是嵌套使用generator时外层的generator需要写大量代码,看如下示例:
注意以下代码均在Python3.6上运行调试
#!/usr/bin/env python# encoding:utf-8def inner_generator():
i = 0
while True:
i = yield i if i > 10: raise StopIterationdef outer_generator():
print("do something before yield")
from_inner = 0
from_outer = 1
g = inner_generator()
g.send(None) while 1: try:
from_inner = g.send(from_outer)
from_outer = yield from_inner except StopIteration: breakdef main():
g = outer_generator()
g.send(None)
i = 0
while 1: try:
i = g.send(i + 1)
print(i) except StopIteration: breakif __name__ == '__main__':
main()041
为了简化,在Python3.3中引入了yield from
yield from
使用yield from有两个好处,
1、可以将main中send的参数一直返回给最里层的generator,
2、同时我们也不需要再使用while循环和send (), next()来进行迭代。
我们可以将上边的代码修改如下:
def inner_generator():
i = 0
while True:
i = yield i if i > 10: raise StopIterationdef outer_generator():
print("do something before coroutine start") yield from inner_generator()def main():
g = outer_generator()
g.send(None)
i = 0
while 1: try:
i = g.send(i + 1)
print(i) except StopIteration: breakif __name__ == '__main__':
main()
执行结果如下:
do something before coroutine start123456789101234567891011
这里inner_generator()中执行的代码片段我们实际就可以认为是协程,所以总的来说逻辑图如下:
我们都知道Python由于GIL(Global Interpreter Lock)原因,其线程效率并不高,并且在*nix系统中,创建线程的开销并不比进程小,因此在并发操作时,多线程的效率还是受到了很大制约的。所以后来人们发现通过yield来中断代码片段的执行,同时交出了cpu的使用权,于是协程的概念产生了。在Python3.4正式引入了协程的概念,代码示例如下:
import asyncio# Borrowed from http://curio.readthedocs.org/en/latest/tutorial.html[email protected] countdown(number, n):
while n > 0:
print('T-minus', n, '({})'.format(number)) yield from asyncio.sleep(1)
n -= 1loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(countdown("A", 2)),
asyncio.ensure_future(countdown("B", 3))]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()12345678910111213141516
示例显示了在Python3.4引入两个重要概念协程和事件循环,
通过修饰符@asyncio.coroutine定义了一个协程,而通过event loop来执行tasks中所有的协程任务。之后在Python3.5引入了新的async & await语法,从而有了原生协程的概念。
async & await
在Python3.5中,引入了aync&await 语法结构,通过”aync def”可以定义一个协程代码片段,作用类似于Python3.4中的@asyncio.coroutine修饰符,而await则相当于”yield from”。
先来看一段代码,这个是我刚开始使用async&await语法时,写的一段小程序。
#!/usr/bin/env python# encoding:utf-8import asyncioimport requestsimport time
async def wait_download(url):
response = await requets.get(url)
print("get {} response complete.".format(url))
async def main():
start = time.time()
await asyncio.wait([
wait_download("http://www.163.com"),
wait_download("http://www.mi.com"),
wait_download("http://www.google.com")])
end = time.time()
print("Complete in {} seconds".format(end - start))
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
这里会收到这样的报错:
Task exception was never retrieved
future: <Task finished coro=<wait_download() done, defined at asynctest.py:9> exception=TypeError("object Response can't be used in 'await' expression",)>
Traceback (most recent call last):
File "asynctest.py", line 10, in wait_download
data = await requests.get(url)
TypeError: object Response can't be used in 'await' expression123456
这是由于requests.get()函数返回的Response对象不能用于await表达式,可是如果不能用于await,还怎么样来实现异步呢?
原来Python的await表达式是类似于”yield from”的东西,但是await会去做参数检查,它要求await表达式中的对象必须是awaitable的,那啥是awaitable呢? awaitable对象必须满足如下条件中其中之一:
1、A native coroutine object returned from a native coroutine function .
原生协程对象
2、A generator-based coroutine object returned from a function decorated with types.coroutine() .
types.coroutine()修饰的基于生成器的协程对象,注意不是Python3.4中asyncio.coroutine
3、An object with an await method returning an iterator.
实现了await method,并在其中返回了iterator的对象
根据这些条件定义,我们可以修改代码如下:
#!/usr/bin/env python# encoding:utf-8import asyncioimport requestsimport time
async def download(url): # 通过async def定义的函数是原生的协程对象
response = requests.get(url)
print(response.text)
async def wait_download(url):
await download(url) # 这里download(url)就是一个原生的协程对象
print("get {} data complete.".format(url))
async def main():
start = time.time()
await asyncio.wait([
wait_download("http://www.163.com"),
wait_download("http://www.mi.com"),
wait_download("http://www.google.com")])
end = time.time()
print("Complete in {} seconds".format(end - start))
loop = asyncio.get_event_loop()
loop.run_until_complete(main())27282930
好了现在一个真正的实现了异步编程的小程序终于诞生了。
而目前更牛逼的异步是使用uvloop或者pyuv,这两个最新的Python库都是libuv实现的,可以提供更加高效的event loop。
uvloop和pyuv
pyuv实现了Python2.x和3.x,但是该项目在github上已经许久没有更新了,不知道是否还有人在维护。
uvloop只实现了3.x, 但是该项目在github上始终活跃。
它们的使用也非常简单,以uvloop为例,只需要添加以下代码就可以了
import asyncioimport uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())123
Ⅲ Python 相比 Java的优势是什么缺点又是什么
Python相比Java的优势如下:
1. Python作为动态语言更适合初学编程者。Python可以让初学者把精力集中在编程对象和思维方法上,而不用去担心语法、类型等等外在因素。而Python清晰简洁的语法也使得它调试起来比Java简单的多。
2. Python有一些Java没有的强大的架构,可以表达非常复杂的逻辑
3. Python有非常强大的支持异步的框架如Eventlet Networking Library,而据Java要实现这些功能就复杂的多。因此Python适合一些可扩展的后台应用。
2. Python作为脚本语言,更适合开发小的应用,而且极其适合在应用发展初期时用来做原型
缺点如下:
1. 由于Python是动态语言,比Java还执行效率低下。python是弱类型语言,编译的时候要check 类型的。
2.何可以运行Java虚拟机的电脑或者移动设备都可以运行Java的应用,而不管在哪里运行Python的程序都需要一个编译器来将Python代码转化为特定的操作系统可理解的代码。
Ⅳ 用python怎样实现异步redis客户端
题主的问题里,访问redis的瓶颈在于网络IO开销太大,跟不上cpu的计算速度。有几个办法,题主可以考虑一下,大前提:cpu计算的数据,前后没什么关联,否则只能用同步方式。
1. 内建多个queue,将需要写回redis的数据,另起多线程(与queue一对一)处理。
2. 使用pipeline方式读写redis,减少网络交互开销。
Ⅳ python 异步 框架有哪些
我所知道的有: Twisted、Tornado、Gevent 和 tulip
目前在用tornado,希望能帮到你
Ⅵ python 异步请求的时候怎么添加代理
有几种方法。一种是设置环境变量http_proxy,它会自动访问这个。 另外一种是你使用urllib2的时候,在参数里加上代理。还有一个是urllib上指定。
比如
import urllib
urllib.urlopen(某网站,proxyes={'http:':"某代理IP地址:代理的端口"})
使用QT时,它的浏览器设置代理要在浏览器初始化参数里指定。
Ⅶ 为什么 Node,js 这么火,而同样异步模式 Python 框架 Twisted 却,大部分
node.js能做成今天这样的局面,而Python里没有这样的子原因主要有如下:
同步IO对异步框架的性能相当致命,业务里没准就会出现一个同步IO操作。
Node解决这个问题靠的是强制异步IO操作,使得Event
driven模型能够高效执行。但是Python里用同步IO应该是很习以为常的事情,要求全异步估计很少人能做到。这就导致了tonado之类的框架无
法流行。
但Node里直接剥夺了你写同步IO的权利,并且Node没有啥历史包袱,推动异步IO比较容易。
另一个原因,js里的闭包实现这个很自然。
如果解决了您的问题请点赞!
如果未解决请继续追问!
Ⅷ 如何将requests变成一个异步HTTP库
安装:
sudo pip install requests
一个获取页面的示例(test01.py):
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
r = requests.get('http://letiantian.me/')
print r.text
如果网络没问题,会获取http://letiantian.me/页面的html代码。
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的效果是异步的。
安装:
sudo pip install gevent
不使用gevent,test02.py代码为:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import urllib2
urls = ["http://letiantian.me/"] *10
def get_content(url):
data = urllib2.urlopen(url).read()
return data
for url in urls:
get_content(url)
使用gevent,test03.py代码为:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import gevent
from gevent import monkey
monkey.patch_socket()
import urllib2
urls = ["http://letiantian.me/"] *10
def get_content(url):
data = urllib2.urlopen(url).read()
return data
jobs = [gevent.spawn(get_content, url) for url in urls]
gevent.joinall(jobs)
# print jobs[0].value
比较两者的运行时间:
zsh >> time python test02.py
python test02.py 0.05s user 0.02s system 0% cpu 7.362 total
zsh >> time python test03.py
python test03.py 0.06s user 0.01s system 3% cpu 2.100 total
可见,使用gevent时,cpu利用率较高,且程序速度也较快(3倍速度,也可能更快)。