Tag Archives: twisted

Ajax/Comet實作聊天室心得

今天為now.in做了一個最陽春版本的聊天室 這聊天室用了AJAX/Comet技術,說穿了AJAX/Comet真的沒什麼,其實不過就一個http request在server端在接受到後,直到有事件發生才回傳,也有另一種做法是利用比較特別的header讓browser對於每次收到的資料分批處理,而這些都在一個response中完成,因為似乎後者還得有browser的支援,所以我用的是前者,而雖然概念上很簡單,但實際做起來會有些細節得注意的 前端不可以有proxy 原本我寫好後放上去結果不能跑,發現原因出在於透過WebFaction前端的Apache再rewrite到我的server,似乎在前端的連線數很快就被擠暴了,因為線上會有數百個連線一直在線上,所以如果前端有proxy,很容易就會被塞暴,後來改用直接連線,問題就解決了 一般的伺服器架構其實根本不適合Ajax/Comet 事實上一般常見的伺服器架構大多都不適合寫Ajax/Comet,為什麼呢? 原因很簡單,大多的伺服器架構都是thread pool之類的做法,一個連線進來,就從thread pool中拿一個worker丟給他去做,在完成之前都屬於在處理的階段,因此你有同時100個連線被Ajax/Comet卡住,就佔掉了thread pool中100個worker,這些worker什麼都不能做,通常只能sleep,定期檢查事件發生了沒,除了伺服器很快就會被塞暴以外,一點效率都沒有,像是Apache就是這類的架構 解決的方案: 非同步的IO 解決方案其實很簡單,就是改用非同步IO的網路框架,我個人最熟的就是Twisted,自然就是選擇這個,身為愛好Python的程式設計師,其實很多時候苦腦的不是沒有選擇,而是選擇太多,Python的非同步網路函式庫不是用一打就能數完的,多到誇張的一個地步,而且一直在增加,不久前又多出了一個Tornado,這也只是冰山一角,有人寫了一篇文章專門是在比較Python非同步網路函式庫的 Asynchronous Servers in Python 當然,這文章裡列出的也只是一部份而已 Twisted的Ajax/Comet做法 class Chatroom(resource.Resource): isLeaf = True def wait(self, request): “””Wait for notifications “”” self.waitingRequests.append(request) log.debug(‘[%s] %d users are waiting’, self.name, len(self.waitingRequests)) … Continue reading

Posted in Python, 中文文章 | Tagged , , , , , , | 8 Comments

The best choice to grab data from websites: Python + Twisted + lxml

The best choice to grab data from websites: Python + Twisted + lxml Continue reading

Posted in English Articles, Python | Tagged , , , , , , | 34 Comments

An auto-retry recipe for Twisted.

I wrote a retry function that can warp all function return Deferred that might fail. That’s no need to modify any exists code of getPage to make it to retry automaticllay. Continue reading

Posted in English Articles, Python, 分享 | Tagged , , , , | 1 Comment

VirtualBox下跑FreeBSD的網路問題和安裝Python模組心得

昨天在VirtualBox上裝了FreeBSD,但是卻遇到無法上網的問題 #ping google.com ping: cannot resolve google.com: No address associated with name 看起來是網路沒有設定好,連DNS都找不到的樣子,於是在網路上找了一找,終於找到了解決方法 ifconfig pcn0 down ifcontig pcn0 media 10baseT/UTP ifconfig pcn0 up dhclient pcn0 解決了之後終於成功地在上面執行了我在Windows下寫的程式,一開始我連什麼指令用來抓檔案都不知道,我只知道curl這樣的指令,但它好像沒有這樣的指令,後來知到有fetch可以用,就裝好了easy_install之後就很方便,接著裝了Twisted,和lxml,而lxml並不是直接用easy_install就可以用,還得先安裝並編譯libxml2和libxslt,但其實也很簡單,先fetch下來,解開壓縮,然後執行 ./configure make install 編譯要花一小段時間,但沒想到這麼順利,沒有什麼編譯錯誤跑出來,完成後再用easy_install安裝lxml就可以了 寫一個小程式來測試 然後執行 Wow! 成功了!

Posted in Python, Unix-Like, 中文文章, 問題 | Tagged , , , , , , | 4 Comments

py2exe 找不到Module的問題

py2exe的問題 接續上一篇所提到的問題 我今天在用py2exe打包一個架構在Twisted的程式成exe時遇到了一個問題,執行產生出來的執行檔會產生這樣的錯誤 ImportError: No module named resource 同時py2exe在產生時也有這樣的說明 [‘FCNTL’, ‘OpenSSL’, ’email.Generator’, ’email.Iterators’, ’email.Utils’, ‘pkg_resources’, ‘pywintypes’, ‘resource’, ‘win32api’, ‘win32con’, ‘win32event’, ‘win32file’, ‘win32pipe’, ‘win32process’, ‘win32security’] 終於,在好心人的幫助下,我的問題得到了回答 答覆 原因似乎是py2exe在某些原因下無法找到某些需要的module,此時就需要使用參數來指示py2exe包含這些module進來,在解決完了Twisted的問題,我又遇到了lxml類似的問題,不過所幸做法差不多,只是增加參數 -p 後面的一個lxml指示py2exe引入此package如此而已 python setup.py py2exe -p win32com,lxml -i twisted.web.resource 最後使用這樣的指令,成功地產生出了可執行的exe檔

Posted in Python, 中文文章 | Tagged , , , | 2 Comments