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