導航:首頁 > 編程語言 > python3非同步框架

python3非同步框架

發布時間:2022-06-30 20:14:47

① 干貨分享!python三大web框架簡單介紹

1、Django



Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MTV的框架模式,即模型M,模板T和視圖V。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟體。



2、Flask



Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。



Flask也被稱為 “microframework” ,因為它使用簡單的核心,用 extension 增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。



Flask 很輕,花很少的成本就能夠開發一個簡單的網站。非常適合初學者學習。Flask 框架學會以後,可以考慮學習插件的使用。例如使用 WTForm + Flask-WTForm 來驗證表單數據,用 SQLAlchemy + Flask-SQLAlchemy 來對你的資料庫進行控制。



3、Tornado



Tornado是一種 Web 伺服器軟體的開源版本。Tornado 和現在的主流 Web 伺服器框架(包括大多數 Python 的框架)有著明顯的區別:它是非阻塞式伺服器,而且速度相當快。



得利於其 非阻塞的方式和對epoll的運用,Tornado 每秒可以處理數以千計的連接,因此 Tornado 是實時 Web 服務的一個 理想框架。



關於干貨分享!Python三大web框架簡單介紹,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。

② Python的爬蟲框架有哪些

向大家推薦十個Python爬蟲框架。

1、Scrapy:Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。它是很強大的爬蟲框架,可以滿足簡單的頁面爬取,比如可以明確獲知url pattern的情況。用這個框架可以輕松爬下來如亞馬遜商品信息之類的數據。但是對於稍微復雜一點的頁面,如weibo的頁面信息,這個框架就滿足不了需求了。它的特性有:HTML, XML源數據 選擇及提取 的內置支持;提供了一系列在spider之間共享的可復用的過濾器(即 Item Loaders),對智能處理爬取數據提供了內置支持。

2、Crawley:高速爬取對應網站的內容,支持關系和非關系資料庫,數據可以導出為JSON、XML等。

3、Portia:是一個開源可視化爬蟲工具,可讓使用者在不需要任何編程知識的情況下爬取網站!簡單地注釋自己感興趣的頁面,Portia將創建一個蜘蛛來從類似的頁面提取數據。簡單來講,它是基於scrapy內核;可視化爬取內容,不需要任何開發專業知識;動態匹配相同模板的內容。

4、newspaper:可以用來提取新聞、文章和內容分析。使用多線程,支持10多種語言等。作者從requests庫的簡潔與強大得到靈感,使用Python開發的可用於提取文章內容的程序。支持10多種語言並且所有的都是unicode編碼。

5、Python-goose:Java寫的文章提取工具。Python-goose框架可提取的信息包括:文章主體內容、文章主要圖片、文章中嵌入的任何Youtube/Vimeo視頻、元描述、元標簽。

6、Beautiful Soup:名氣大,整合了一些常用爬蟲需求。它是一個可以從HTML或XML文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間。Beautiful Soup的缺點是不能載入JS。

7、mechanize:它的優點是可以載入JS。當然它也有缺點,比如文檔嚴重缺失。不過通過官方的example以及人肉嘗試的方法,還是勉強能用的。

8、selenium:這是一個調用瀏覽器的driver,通過這個庫你可以直接調用瀏覽器完成某些操作,比如輸入驗證碼。Selenium是自動化測試工具,它支持各種瀏覽器,包括 Chrome,Safari,Firefox等主流界面式瀏覽器,如果在這些瀏覽器裡面安裝一個 Selenium 的插件,可以方便地實現Web界面的測試. Selenium支持瀏覽器驅動。Selenium支持多種語言開發,比如 Java,C,Ruby等等,PhantomJS 用來渲染解析JS,Selenium 用來驅動以及與Python的對接,Python進行後期的處理。

9、cola:是一個分布式的爬蟲框架,對於用戶來說,只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多台機器上,整個過程對用戶是透明的。項目整體設計有點糟,模塊間耦合度較高。

10、PySpider:一個國人編寫的強大的網路爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分布式架構,支持多種資料庫後端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。Python腳本控制,可以用任何你喜歡的html解析包。

以上就是分享的Python爬蟲一般用的十大主流框架。這些框架的優缺點都不同,大家在使用的時候,可以根據具體場景選擇合適的框架。

③ Python Web開發比較流行的框架都有什麼

目前Python流行的Web框架包括:Django、Flask和Tornado。框架把構建Web應用的通用的代碼進行了封裝,把相應的模塊組織起來,使用Web框架可以更輕松、快捷的創建web應用,不用去關注一些底層細節。

1、Django框架

Django是基於Python的免費和開放源代碼Web框架,它遵循模型-模板-視圖(MTV)體系結構模式。它由Django Software Foundation(DSF)維護,這是一個由非營利組織成立的獨立組織。Django對基礎的代碼進行了封裝並提供相應的 API,開發者在使用框架是直接調用封裝好的 API 可以省去很多代碼編寫,從而提高工作效率和開發速度。

Django的設計理念如下:

①松耦合——Django的目標是使堆棧中的每個元素彼此獨立。

②更少的編碼——更少的代碼,因此可以快速開發。

③不重復自己(DRY)——一切都應該只在一個地方開發,而不是一次又一次地重復。

④快速開發——Django的理念是盡一切可能促進超快速開發。

⑤簡潔的設計——Django嚴格按照自己的代碼維護簡潔的設計,並易於遵循最佳的Web開發實踐。

Django的一些優勢如下:

①對象關系映射(ORM)支持——Django在數據模型和資料庫引擎之間建立了橋梁,並支持包括MySQL,Oracle,Postgres等在內的大量資料庫系統。

②多語言支持——Django通過其內置的國際化系統支持多語言網站。因此,您可以開發支持多種語言的網站。

③框架支持——Django內置了對Ajax,RSS,緩存和其他各種框架的支持。

④GUI——Django為管理活動提供了一個很好的即用型用戶界面。

⑤開發環境——Django帶有輕量級的Web伺服器,以促進端到端應用程序的開發和測試。

⑥Django是Python Web框架。和大多數現代框架一樣,Django支持MVC模式。

2、Flask框架

Flask 是 Python 編寫的一種輕量級 ( 微 ) 的 Web 開發框架,只提供 Web 框架的核心功能,較其他類型的框架更為的自由、靈活、更加適合高度定製化的 Web 項目。Flask 在功能上面沒有欠缺,只不過更多的選擇及功能的實現交給了開發者去完成,因此 Flask 對開發人員的水平有了一定的要求。

3、Tornado框架

在之前的學習過程當中,學習過了 Flask 和 Django 這兩個 Python Web 框架,現在來認識一個更加復雜但是高效的 Python Web 框架 : Tornado。

Tornado 是 Python 編寫的一個強大的可擴展的 Web 伺服器,在處理高網路流量的時候表現的足夠強大,但是在創建的時候,和 Flask 類似又足夠輕量,並且可以被用到大量的工具當中。相對於其他的框架,

Tornado 有如下特點:

1、完整的 Web 開發框架,和 Django,Flask 一樣,Tornado 也提供了路由映射,request 上下文,基於模板的頁面渲染這些功能。

2、同樣是一個高效的網路庫,性能可以和 Python 的 Twisted,Gevent 等底層框架媲美,同時提供了非同步IO, 超時事件處理,功能,這樣 twisted 除了做 Web 之外還可以做爬蟲,物聯網關或者游戲伺服器等後台應用。

3、提供了高效的 HTTPClient, 除了伺服器端框架,還提供了基於非同步框架的 HTTP 客戶端

4、提供了高效的內部伺服器,Tornado 的內部伺服器可以直接用於生產環境

5、完備的 WebSocket 支持

關於Python的基礎問題可以看下這個網頁的視頻教程,網頁鏈接,希望我的回答能幫到你。

④ python的爬蟲框架有哪些

實現爬蟲技術的編程環境有很多種,Java、Python、C++等都可以用來爬蟲。但很多人選擇Python來寫爬蟲,為什麼呢?因為Python確實很適合做爬蟲,豐富的第三方庫十分強大,簡單幾行代碼便可實現你想要的功能。更重要的,Python也是數據挖掘和分析的好能手。
高效的Python爬蟲框架。分享給大家。
1.Scrapy
Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。。用這個框架可以輕松爬下來如亞馬遜商品信息之類的數據。
2.PySpider
pyspider 是一個用python實現的功能強大的網路爬蟲系統,能在瀏覽器界面上進行腳本的編寫,功能的調度和爬取結果的實時查看,後端使用常用的資料庫進行爬取結果的存儲,還能定時設置任務與任務優先順序等。
3.Crawley
Crawley可以高速爬取對應網站的內容,支持關系和非關系資料庫,數據可以導出為JSON、XML等。
4、Portia:是一個開源可視化爬蟲工具,可讓使用者在不需要任何編程知識的情況下爬取網站!簡單地注釋自己感興趣的頁面,Portia將創建一個蜘蛛來從類似的頁面提取數據。簡單來講,它是基於scrapy內核;可視化爬取內容,不需要任何開發專業知識;動態匹配相同模板的內容。
5.Newspaper
Newspaper可以用來提取新聞、文章和內容分析。使用多線程,支持10多種語言等。
6、Python-goose:Java寫的文章提取工具。Python-goose框架可提取的信息包括:文章主體內容、文章主要圖片、文章中嵌入的任何Youtube/Vimeo視頻、元描述、元標簽。
7.Grab

Grab是一個用於構建Web刮板的Python框架。藉助Grab,您可以構建各種復雜的網頁抓取工具,從簡單的5行腳本到處理數百萬個網頁的復雜非同步網站抓取工具
8、selenium:這是一個調用瀏覽器的driver,通過這個庫你可以直接調用瀏覽器完成某些操作,比如輸入驗證碼。

⑤ python的框架有哪些 知乎

\

1. Django。如樓上所說,是一個全能型框架。目前 Django 的使用面還是很廣的,有學習的價值,但是不建議初學者學習,因為要學習的東西太多了,一下子難以吸收會失去興趣。當然,Django 的目的是為了讓開發者能夠 快速 地開發一個網站,它提供了很多模塊,其中我最喜歡的就是 admin 模塊,your.site.com/admin 就進入了網站的後台(內置的哦~)方便地對數據進行操作,等等。。。。因此,如果對 Django 熟悉的話,papapa 一下子就寫好一個網站的原型了。
2. Tornado。傳說中性能高高的框架。Tornado 是一個很好的框架,支持非同步處理的功能,這是它的特點,其他框架不支持。另外一點是,Tornado 的設計似乎更注重 RESTful URL。但 Tornado 提供了網站基本需要使用的模塊外,剩下的則需要開發者自己進行擴展。例如資料庫操作,雖然內置了一個 database 的模塊(後來獨立出去了,現在叫做 torndb,bdarnell/torndb · GitHub)但是不支持 ORM,快速開發起來還是挺吃力的。如果需要 ORM 支持的話,還需要自己寫一層將 SQLAlchemy 和 Tornado 聯系起來,而且這里還有一個坑。
BTW:知乎就是基礎 Tornado 開發的。
3. Bottle。Bottle 和 Flask 都屬於輕量級的 Web 框架。但是 Bottle 似乎落寞了。我覺得跟他的 API 設計有關系。個人認為 Bottle 使用起來不那麼順手,因此也用得少。這里不做太多介紹。
4. web.py。也是很輕的一個框架,使用不多,也不做介紹。
5. web2py。我看樓上都沒有對這個框架做介紹。這個框架是 Google 在 web.py 基礎上二次開發而來的,兼容 GAE 。性能據說很高,曾經用他來做自己的主頁,感覺也還不錯。缺點同樣是對擴展支持不太好,需要自己進行擴展。
6. Quixote。著名的 豆瓣 就是基於 Quixote 開發的。跟上面幾個框架不同,Quixote 的路由會有些特別。另外 Quixote 的性能據說也好。

⑥ 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/[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 web框架有哪些

1、Django
Python中最全能的Web開發框架,各種功能完備,可維護性和開發速度都一級棒,不少人反應Django框架慢,它主要慢在DjangoORM與資料庫的交互上,所以是否使用Django框架,需要取決於項目對資料庫交互的要求以及各種優化,而對於Django的同步特性導致吞吐量小的問題,可以通過Celery等解決,這並不是一個致命問題。
2、Tornado
非同步,性能強悍,然而它相比Django框架來說,相對原始,很多東西需要自己去處理,隨著項目的逐漸擴大,框架所能提供的功能也會越來越小,更多的東西需要團隊自己去實現,而大項目往往需要性能的保證,這時它就是最佳的選擇。
3、Flask
微框架,可以說是Python代碼寫得最好的項目之一,它的靈活性也是把雙刃劍,能使用好Flask框架,即可以做成Pinterest,用不好就是災難,它是一個微框架,但也可以做成規模化的Flask,加上它可以自由選擇自己的資料庫交互組件,而且加上celery+redis等非同步特性之後,Flask的性能相對Tornado也不相上下,也許Flask的靈活性可能是某些團隊更需要的。
4、Twisted
前面提到的3個Web框架都是圍繞應用層HTTP展開的,而Twisted則不同,它是一個用Python語言編寫的事件驅動的網路框架,對於追求伺服器性能的應用,它是個非常不錯的選擇。
它支持很多協議,包括傳輸層的UDP、TCP、TLS,以及應用層的HTTP、FTP等,對於這些協議,Twisted提供了客戶端和伺服器方面的開發工具。
它是一個高性能的編程框架,在不同的操作系統上,Twisted利用不同的底層技術實現了高性能通信,在開發方法上,Twisted引導程序員使用非同步編程模型,它提供了豐富的Defer、Threading等特性來支持非同步編程。

⑧ 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 非同步 框架有哪些

我所知道的有: Twisted、Tornado、Gevent 和 tulip
目前在用tornado,希望能幫到你

⑩ Python三大web框架分別是什麼 哪個更好

【導讀】目前,Python比較火的三大web框架有Django、Flask和Tornado,要論這三個Web框架哪個更好的話,建議一點,Django幫我們事先搭建了好多,上手會快一些,學習的話可以先從Django學起,然後再學習Flask和Tornado,下面我們就來具體了解一下Python三大web框架的詳情。

1、Django

Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MTV的框架模式,即模型M,模板T和視圖V。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟體。

2、Flask

Flask是一個使用Python編寫的輕量級Web應用框架。其 WSGI工具箱採用Werkzeug ,模板引擎則使用 Jinja2
。Flask使用BSD授權。

Flask也被稱為 「microframework」 ,因為它使用簡單的核心,用 extension
增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。

Flask 很輕,花很少的成本就能夠開發一個簡單的網站。非常適合初學者學習。Flask 框架學會以後,可以考慮學習插件的使用。例如使用 WTForm +
Flask-WTForm 來驗證表單數據,用 SQLAlchemy + Flask-SQLAlchemy 來對你的資料庫進行控制。

3、Tornado

Tornado是一種 Web 伺服器軟體的開源版本。Tornado 和現在的主流 Web 伺服器框架(包括大多數 Python
的框架)有著明顯的區別:它是非阻塞式伺服器,而且速度相當快。

得利於其 非阻塞的方式和對epoll的運用,Tornado 每秒可以處理數以千計的連接,因此 Tornado 是實時 Web 服務的一個
理想框架。

關於Python三大web框架的簡單介紹,就給大家分享到這里了,當然學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚,希望大家抓緊時間進行學習吧。

閱讀全文

與python3非同步框架相關的資料

熱點內容
華為伺服器如何進陣列卡配置 瀏覽:433
apache伺服器ip地址訪問 瀏覽:716
如何買到安卓手機預裝軟體 瀏覽:535
冤罪百度雲不要壓縮 瀏覽:83
蘇州雲存儲伺服器 瀏覽:173
解壓收納原聲 瀏覽:384
java注冊驗證 瀏覽:372
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:835
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:904
無錫代碼編程培訓班 瀏覽:632
eps圖形數據加密 瀏覽:933