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倍速度,也可能更快)。