導航:首頁 > 編程語言 > python終結者模式例子

python終結者模式例子

發布時間:2023-02-07 18:17:42

python 怎麼讓程序接受ctrl + c終止信號

花了一天時間用python為服務寫了個壓力測試。很簡單,多線程向伺服器發請求。但寫完之後發現如果中途想停下來,按Ctrl+C達不到效果,自然想到要用信號處理函數捕捉信號,使線程都停下來,問題解決的方法請往下看:

復制代碼代碼如下:

#!/bin/env python
# -*- coding: utf-8 -*-
#filename: peartest.py

import threading, signal

is_exit = False

def doStress(i, cc):
global is_exit
idx = i
while not is_exit:
if (idx < 10000000):
print "thread[%d]: idx=%d"%(i, idx)
idx = idx + cc
else:
break
print "thread[%d] complete."%i

def handler(signum, frame):
global is_exit
is_exit = True
print "receive a signal %d, is_exit = %d"%(signum, is_exit)

if __name__ == "__main__":
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
cc = 5
for i in range(cc):
t = threading.Thread(target=doStress, args=(i,cc))
t.start()

上面是一個模擬程序,並不真正向服務發送請求,而代之以在一千萬以內,每個線程每隔並發數個(cc個)列印一個整數。很明顯,當所有線程都完成自己的任務後,進程會正常退出。但如果我們中途想退出(試想一個壓力測試程序,在中途已經發現了問題,需要停止測試),該腫么辦?你當然可以用ps查找到進程號,然後kill -9殺掉,但這樣太繁瑣了,捕捉Ctrl+C是最自然的想法。上面示常式序中已經捕捉了這個信號,並修改全局變數is_exit,線程中會檢測這個變數,及時退出。
但事實上這個程序並不work,當你按下Ctrl+C時,程序照常運行,並無任何響應。網上搜了一些資料,明白是python的子線程如果不是daemon的話,主線程是不能響應任何中斷的。但設為daemon後主線程會隨之退出,接著整個進程很快就退出了,所以還需要在主線程中檢測各個子線程的狀態,直到所有子線程退出後自己才退出,因此上例29行之後的代碼可以修改為:

復制代碼代碼如下:

threads=[]
for i in range(cc):
t = threading.Thread(target=doStress, args=(i, cc))
t.setDaemon(True)
threads.append(t)
t.start()
for i in range(cc):
threads[i].join()

重新試一下,問題依然沒有解決,進程還是沒有響應Ctrl+C,這是因為join()函數同樣會waiting在一個鎖上,使主線程無法捕獲信號。因此繼續修改,調用線程的isAlive()函數判斷線程是否完成:

復制代碼代碼如下:

while 1:
alive = False
for i in range(cc):
alive = alive or threads[i].isAlive()
if not alive:
break

這樣修改後,程序完全按照預想運行了:可以順利的列印每個線程應該列印的所有數字,也可以中途用Ctrl+C終結整個進程。完整的代碼如下:

復制代碼代碼如下:

#!/bin/env python
# -*- coding: utf-8 -*-
#filename: peartest.py

import threading, signal

is_exit = False

def doStress(i, cc):
global is_exit
idx = i
while not is_exit:
if (idx < 10000000):
print "thread[%d]: idx=%d"%(i, idx)
idx = idx + cc
else:
break
if is_exit:
print "receive a signal to exit, thread[%d] stop."%i
else:
print "thread[%d] complete."%i

def handler(signum, frame):
global is_exit
is_exit = True
print "receive a signal %d, is_exit = %d"%(signum, is_exit)

if __name__ == "__main__":
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
cc = 5
threads = []
for i in range(cc):
t = threading.Thread(target=doStress, args=(i,cc))
t.setDaemon(True)
threads.append(t)
t.start()
while 1:
alive = False
for i in range(cc):
alive = alive or threads[i].isAlive()
if not alive:
break

其實,如果用python寫一個服務,也需要這樣,因為負責服務的那個線程是永遠在那裡接收請求的,不會退出,而如果你想用Ctrl+C殺死整個服務,跟上面的壓力測試程序是一個道理。總結一下,python多線程中要響應Ctrl+C的信號以殺死整個進程,需要:
1.把所有子線程設為Daemon;
2.使用isAlive()函數判斷所有子線程是否完成,而不是在主線程中用join()函數等待完成;
3.寫一個響應Ctrl+C信號的函數,修改全局變數,使得各子線程能夠檢測到,並正常退出。

㈡ python web開發用什麼框架

對初學者來說,循序漸進是最重要的,我推薦學習 Flask(Welcome | Flask (A Python Microframework))

Flask 很輕,花很少的成本就能夠開發一個簡單的網站。非常適合初學者學習。
Flask 框架學會以後,可以考慮學習插件的使用。例如使用 WTForm + Flask-WTForm 來驗證表單數據,用 SQLAlchemy + Flask-SQLAlchemy 來對你的資料庫進行控制。
BTW:果殼網基於 Flask 開發的。
另外也簡單介紹下其他框架:
1. Django。如樓上所說,是一個全能型框架。目前 Django 的使用面還是很廣的,有學習的價值,但是不建議初學者學習,因為要學習的東西太多了,一下子難以吸收會失去興趣。當然,Django 的目的是為了讓開發者能夠 快速 地開發一個網站,它提供了很多模塊,其中我最喜歡的就是 admin 模塊,http://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 web開發用哪個框架比較好

(1)Django。Django的文檔最完善、市場佔有率最高、招聘職位最多估計大家都沒什麼意見。完美的文檔,Django的成功,我覺得很大一部分原因要歸功於Django近乎完美的官方文檔(包括Django book)。全套的解決方案,Django象Rails一樣,提供全套的解決方案(full-stack framework + batteries included),基本要什麼有什麼(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,開發網 站應手的工具Django基本都給你做好了,因此開發效率是不用說的,出了問題也算好找,不在你的代碼里就在Django的源碼里。
(2)Pylons和Django的設計理念完全不同,Pylons本身只有兩千行左右的Python代碼,不過它還附帶有一些幾乎就是Pylons御用 的第三方模塊。Pylons只提供一個架子和可選方案,你可以根據自己的喜好自由的選擇Template、ORM、form、auth等組件,系統高度可 定製。我們常說Python是一個膠水語言(glue language),那麼我們完全可以說Pylons就是一個用膠水語言設計的膠水框架。
(3)Tornado即是一個Web server(對此本文不作詳述),同時又是一個類web.py的micro-framework,作為框架Tornado的思想主要來源於Web.py,大家在Web.py的網站首頁也可以看到Tornado的大佬Bret Taylor的這么一段話(他這里說的FriendFeed用的框架跟Tornado可以看作是一個東西):
(4)Bottle和Flask作為新生一代Python框架的代表,挺有意思的是都採用了decorator的方式配置URL路由。
(5)Flask 精簡
(6)web.py 非常精簡

㈣ 誰能簡單說一下python幾個框架的特點吧

1.CubicWeb
CubicWeb的最重要的功能是其代碼的可重用性,由一個個代碼單元組成。它靈活又強大,並且還有一些特別的功能,包括RQL查詢語言和支持有效編碼的語義視圖功能。這是語義Web應用程序的最佳解決方案,並且提供理想的環境。
作為一個程序員,我們必須了解Python這門編程語言的靈活和強大。框架的選擇取決於Web應用程序的使用目的和復雜程度。測量項目所需的負荷、可擴展性和效率是關鍵。

官方網站:http://www.cubicweb.org/
2.Zope2
Zope是不同Web框架集合在一起的完整家庭。與其他框架相比,zope2在當前的開發環境中對於內容管理系統是相當有限的。 Zope工具包是一個很好的庫資源,允許使用重用代碼和不同的庫。

官方網站:https://pypi.python.org/pypi/Zope2
3.web2py
web2py最重要的因素是其外部零依賴,可以創建、復原、管理和修改在瀏覽器中的應用程序。對於一些簡單的web開發任務,大部分都可以自動化快速開發。程序員甚至不需要再准備單一的開發、調試、測試、部署和資料庫處理的封裝包。內置的Web界面中這些都有,在使用之前也不需要進行安裝。

官方網站:http://www.web2py.com/
4.TurboGears
TurboGears也稱為是框架的終結者,因為它雖然有著其他Python框架都有的功能,卻不像其他框架那樣有局限性。它甚至能適用於簡單的微架構項目。它給人的感覺就不像是工作在框架上,而像是在寫新的功能。你可以在幾分鍾之內可以創建一個read-to-extend應用,並且我們可以在網上找到大量的教程。

官方網站:http://www.turbogears.org/
5.Pylons
靈活性是pylons框架的主要特點之一。它可以將不同Python框架提供的某些最好功能,整合到同一個地方。Pyramid是pylons的第一批產品之一,它把重點放在了快速和靈活開發實踐上。你可以挑選任何你認為可以提高Web開發效率的功能整合到一起。

官方網站:http://www.pylonsproject.org/
6.Grok
它由Zope工具包提供支持,並且一開始的時候是作為一個易擴展的Zope工具箱,為了方便那些菜鳥程序員的使用而開發 的。對於Web應用,Grok不但能提供多個構件,還有一個隨時可以提供支持的很好社區。它提供了一種更為簡單和靈活的學習Python的模式。它配備的可DRY方法使得它成為了一個很好的工具。

官方網站:http://grok.zope.org/
7.Web.py
之所以說這是一款非常獨特的框架,主要是因為它的簡單性和功能強大的開發能力。你可以用Python語言舒舒服服地編寫web應用程序。你會因為它的零局限性和易用性喜歡上web.py。有些程序員可能會發現它對功能的限制比較少,因為它預留了整合的空間,所以你不必一下子載入所有的功能,尤其是那些你並不需要的。

官方網站:http://webpy.org/
8.Pyramid
Pyramid以其高效率和快節奏的開發能力而出名。這個框架最妙的是包含了一些Python,Perl和Ruby提供的最獨特的功能。此開源Web框架有一個獨立於平台的MVC結構,提供了開發的最簡途徑。此外,它還是高效開發重用代碼的首選平台之一。

官方網站:http://www.pylonsproject.org/projects/pyramid/about
9.CherryPy
CherryPy起源的其中一個最重要的原因是,它與Python兼容,並且它Python化的介面允許開發人員像Python提供的其他任何模塊一樣將其整合。另一個優秀的特點是能夠自定義各個功能,並配備了本地適配器(mod_python),使得它非常適合開發。它為每一個WSGI功能適配器提供支持,並允許CherryPy的廣泛實施。

官方網站:http://www.cherrypy.org/
10.Flask
Flask是一款可擴展卻又簡單的微架構。可能剛用的時候你會覺得它缺少某些功能,如表單驗證、資料庫抽象層、添加常用功能的第三方庫。但是,它允許擴展,使得它更易於添加所需的功能。它的有些功能如單元測試非常適用於開發,並且支持客戶端應用程序使用安全的cookies。它更適用於輕量級的應用程序和項目。

閱讀全文

與python終結者模式例子相關的資料

熱點內容
小奔運動app網路異常怎麼回事 瀏覽:447
php開啟壓縮 瀏覽:303
伺服器主機如何設置啟動 瀏覽:282
linux配置網路命令 瀏覽:774
一張照片怎麼製作視頻app 瀏覽:908
pythonweb和php 瀏覽:976
電腦伺服器地址ip地址 瀏覽:823
對矩陣壓縮是為了 瀏覽:910
setfacl命令 瀏覽:172
linux子系統中斷 瀏覽:342
linux查看進程ps 瀏覽:224
知識庫系統php 瀏覽:623
小波變換壓縮圖像python 瀏覽:151
阿里巴巴程序員怎麼月入百萬 瀏覽:173
如何使用國外伺服器 瀏覽:188
燃燈者pdf 瀏覽:468
編譯器用數學嗎 瀏覽:7
圖形化apk反編譯工具 瀏覽:48
考勤表加密怎麼辦 瀏覽:735
arj壓縮與解壓批處理怎麼寫 瀏覽:658