❶ Python主要要學那些課程啊
鏈接:
賀聖軍Python輕松入門到項目實戰(經典完整版)(超清視頻)網路網盤
沒有像jstack那麼方便直接用的東西,一般來說有幾個方案:
IDE: 用諸如 PyCharm, Eclpise with Pydev 的工具調試版,覺得掛起的時候暫停並權檢查各個調用棧。
GDB: 優點是可以調試到native extension,缺點也很明顯,需要在編譯Python的時候加上Debug Symbols,默認這個是沒有的。簡單的說就是功能強大但是配得麻煩。
pdb:適合下斷點...
pudb: 改下代碼,在程序入口import pudb; pudb.set_interrupt_handler(),在運行的時候就可以Ctrl-C進入到互動式調試環境,易用性還好吧。
擼一個singal handler用於列印所有棧信息,參考 celery 實現的 install_cry_handler,或者看看 signalhandler,這個在 Python 3.3 自帶了。
❸ 初學者怎麼學習Python
Python是一種計算機程序設計語言。你可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java語言,適合初學者的Basic語言,適合網頁編程的JavaScript語言等等。
那Python是一種什麼語言?
首先,我們普及一下編程語言的基礎知識。用任何編程語言來開發程序,都是為了讓計算機幹活,比如下載一個MP3,編寫一個文檔等等,而計算機幹活的CPU只認識機器指令,所以,盡管不同的編程語言差異極大,最後都得「翻譯」成CPU可以執行的機器指令。而不同的編程語言,干同一個活,編寫的代碼量,差距也很大。
比如,完成同一個任務,C語言要寫1000行代碼,Java只需要寫100行,而Python可能只要20行。
所以Python是一種相當高級的語言。
你也許會問,代碼少還不好?代碼少的代價是運行速度慢,C程序運行1秒鍾,Java程序可能需要2秒,而Python程序可能就需要10秒。
那是不是越低級的程序越難學,越高級的程序越簡單?表面上來說,是的,但是,在非常高的抽象計算中,高級的Python程序設計也是非常難學的,所以,高級程序語言不等於簡單。
但是,對於初學者和完成普通任務,Python語言是非常簡單易用的。連Google都在大規模使用Python,你就不用擔心學了會沒用。
用Python可以做什麼?可以做日常任務,比如自動備份你的MP3;可以做網站,很多著名的網站包括YouTube就是Python寫的;可以做網路游戲的後台,很多在線游戲的後台都是Python開發的。總之就是能幹很多很多事啦。
Python當然也有不能乾的事情,比如寫操作系統,這個只能用C語言寫;寫手機應用,只能用Objective-C(針對iPhone)和Java(針對Android);寫3D游戲,最好用C或C++。
如果你是小白用戶,滿足以下條件:
會使用電腦,但從來沒寫過程序;
還記得初中數學學的方程式和一點點代數知識;
想從編程小白變成專業的軟體架構師;
每天能抽出一個半小時學習。可以看下面的代碼
learning=input('DoyouwanttolearnPythonnow(YesorNo):')
a=str(learning)
ifa=='Yes':
print('QQ1129834903')
else:
print('Thanks!!')
❹ 如何在多個機器上搭建celery的集群環境
1、torm集群中包含兩類節點:主控節點(Master Node)和工作節點(Work Node)。其分別對應的角色如下:
主控節點(Master Node)上運行一個被稱為Nimbus的後台程序,它負責在Storm集群內分發代碼,分配任務給工作機器,並且負責監控集群運行狀態。Nimbus的作用類似於Hadoop中JobTracker的角色。
每個工作節點(Work Node)上運行一個被稱為Supervisor的後台程序。Supervisor負責監聽從Nimbus分配給它執行的任務,據此啟動或停止執行任務的工作進程。每一個工作進程執行一個Topology的子集;一個運行中的Topology由分布在不同工作節點上的多個工作進程組成。
Nimbus和Supervisor節點之間所有的協調工作是通過Zookeeper集群來實現的。此外,Nimbus和Supervisor進程都是快速失敗(fail-fast)和無狀態(stateless)的;Storm集群所有的狀態要麼在Zookeeper集群中,要麼存儲在本地磁碟上。這意味著你可以用kill -9來殺死Nimbus和Supervisor進程,它們在重啟後可以繼續工作。這個設計使得Storm集群擁有不可思議的穩定性。
如何安裝部署Storm集群
這一章節將詳細描述如何搭建一個Storm集群。下面是接下來需要依次完成的安裝步驟:•搭建Zookeeper集群;•安裝Storm依賴庫;•下載並解壓Storm發布版本;•修改storm.yaml配置文件;•啟動Storm各個後台進程。
2.1 搭建Zookeeper集群
Storm使用Zookeeper協調集群,由於Zookeeper並不用於消息傳遞,所以Storm給Zookeeper帶來的壓力相當低。大多數情況下,單個節點的Zookeeper集群足夠勝任,不過為了確保故障恢復或者部署大規模Storm集群,可能需要更大規模節點的Zookeeper集群(對於Zookeeper集群的話,官方推薦的最小節點數為3個)。在Zookeeper集群的每台機器上完成以下安裝部署步驟:
1)下載安裝Java JDK,官方下載鏈接為javasuncom/javase/downloads/indexjsp,JDK版本為JDK 6或以上。
2)根據Zookeeper集群的負載情況,合理設置Java堆大小,盡可能避免發生swap,導致Zookeeper性能下降。保守期間,4GB內存的機器可以為Zookeeper分配3GB最大堆空間。
3)下載後解壓安裝Zookeeper包,官方下載鏈接為hadoopapacheorg/zookeeper/releaseshtml。
4)根據Zookeeper集群節點情況,創建如下格式的Zookeeper配置文件zoo.cfg:tickTime=2000dataDir=/var/zookeeper/clientPort=2181initLimit=5syncLimit=2server.1=zoo1:2888:3888server.2=zoo2:2888:3888server.3=zoo3:2888:3888
其中,dataDir指定Zookeeper的數據文件目錄;其中server.id=host:port:port,id是為每個Zookeeper節點的編號,保存在dataDir目錄下的myid文件中,zoo1~zoo3表示各個Zookeeper節點的hostname,第一個port是用於連接leader的埠,第二個port是用於leader選舉的埠。
5)在dataDir目錄下創建myid文件,文件中只包含一行,且內容為該節點對應的server.id中的id編號。
6)啟動Zookeeper服務:
java -cp zookeeper.jar:lib/log4j-1.2.15.jar:conf \ org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.cfg
也可以通過bin/zkServer.sh腳本啟動Zookeeper服務。
7)通過Zookeeper客戶端測試服務是否可用:•Java客戶端下,執行如下命令:
java -cp zookeeper.jar:src/java/lib/log4j-1.2.15.jar:conf:src/java/lib/jline-0.9.94.jar \ org.apache.zookeeper.ZooKeeperMain -server 127.0.0.1:2181
也可以通過bin/zkCli.sh腳本啟動Zookeeper Java客戶端。•C客戶端下,進入src/c目錄下,編譯單線程或多線程客戶端:
./configuremake cli_stmake cli_mt
運行進入C客戶端:
cli_st 127.0.0.1:2181cli_mt 127.0.0.1:2181
至此,完成了Zookeeper集群的部署與啟動。
3、向集群提交任務
1)啟動Storm Topology:
storm jar allmycode.jar org.me.MyTopology arg1 arg2 arg3
其中,allmycode.jar是包含Topology實現代碼的jar包,org.me.MyTopology的main方法是Topology的入口,arg1、arg2和arg3為org.me.MyTopology執行時需要傳入的參數。
2)停止Storm Topology:
storm kill {toponame}
其中,{toponame}為Topology提交到Storm集群時指定的Topology任務名稱。
❺ Celery 周期任務運行一段時間後意外停止
用Python Django做了一個網站。後端有些周期抓數據的需求,分布式任務隊列 Celery 派上了用場。
投入使用後,發現一個問題,運行一段時間後,周期更新的數據刷新時間停留在幾天之前,Celery任務莫名其妙就不起作用了。查看日誌,Celery beat日誌是按周期在更新,但Celery worker日誌停留在幾天之前。查看進程,beat、worker進程均運行良好。一頭霧水。每次碰到這種情況,只能重啟。然後過一段時間又不起作用了,斷斷續續困擾大半年時間。
曾經也暗罵python輪子咋這樣不靠譜,甚至也想轉投java的懷抱,用spring boot搞一下。略一思考,轉投java也有切換成本,換過去之後,也會碰到這樣那樣的問題。如果這個技術棧上碰到問題解決不了,換個技術棧碰到問題可能還是束手或山無策。換晌攜到java的好處可能是使用廣泛,有問題都是別人已經趟過的坑,容易找到借鑒經驗。小眾的技術棧就沒這么好的待遇了。
那麼,想辦法解決問題吧。
在google多番搜索,有一些線索可供參考。其中一個是說psycopg2、與postgres使用時可能會死鎖。原因是postgres使用ssl時在一個callback中加了個鎖,但是個callback是共用的,postgres自己unload時會釋放這個鎖,但是其他使用這個callback的並不知道,然後就死鎖了。解決方案是把psycopg2升級到2.6版本以上。
具體可以參考Media上這篇文章。 https://medium.com/squad-engineering/two-years-with-celery-in-proction-bug-fix-edition-22238669601d
但是我的版本已經是2.8了。所以這個解決方案並不能完全適用於我的問題。不過死鎖還是給了我啟發。可能celery worker執行某個任務時卡死了。
沿著這個線索繼續探索吧。
OK,查死鎖,下面進入debug階段。
看得出來有2個任務是active狀態,但是把timestamp轉化一下,是2天之前了。這2個任務不可能要運行這么長時間的。那麼肯定是卡住了。
Media文章里用的strace看卡哪了,嗯,可以效仿。一試,我的vps並沒安裝這個命令對應的庫。好嗎,畢竟買的廉價低配版,不增加負擔。不就是要列印調用棧么,用cat /proc/{pid}/stack。
可以看得出來,一個卡在了tcp wait recv_msg上了。一個卡在了pipe_wait上了。2個任務都卡在了IO等待上。
這2個應該都不是死鎖,抓取數據tcp請求不可能會死鎖的,還是應該要設置超時時間。至衫謹中於pipe,可能生產者意外退出,導致消費者拿不到數據而一直死等。
IO相關操作設置超時時間。