Linebot Django 5

less than 1 minute read

LINE BOT Message 初學者記錄(五)

為了使每日中午吃飯不用點擊就可自動顯示食物, 於是乎 push message 使用現身了.   先參考 Line 官方文件 Server 在美洲故相差約 12 hr 一開始使用 While True 跑回圈, 悲劇發生, 整個程式都在等 While True 迴圈跑完… 故事開始了,我的名字叫哈雅貼。是一位稱職的管家。一個陽光明媚的早晨,我準備好了早飯,神清氣爽地去喊樓上妹子們起床。可是妹子們都很懶的… 於是:blocking 我來到第一個妹子的門前:“起床了!”,然後就站在這等著。過了半個小時,妹子出來了,我幫她盛好飯,再去叫第二個妹子。

non-blocking 我發現一直站在門外挺傻的,於是這次,叫完後我就轉身走了。隨便在周圍干點什麼,每隔一小會兒回來看看妹子起來了沒有。如果起來了,我就去盛飯。然後叫下一個妹子。

multiplexing 這時我又忽然想到,幹嘛非得一個一個來呢?既然我都有時間四處轉悠了,完全可以一次多叫幾個妹子啊? 於是我一口氣叫醒了所有妹子,然後在樓梯口等著,誰先出來,先幫誰盛飯。注意到了嗎,這和 non-blocking 下的行為在本質上是一樣的) multiplexing 的意義是:把原本依次執行的任務,變為同時執行。就像原來的單車道,現在變成了四車道。這樣在任務數比較多的情況下,效率能夠得到極大的提升。 (不過如果任務數很少,那麼反而有可能降低效率,因為維護任務隊列也是要成本的)。多路復用帶來的另一個變化是:任務完成的順序變得不確定了。 例如最後一個任務可能會第一個完成。大部分情況下這不是問題,就像妹子們誰先去吃飯都沒關係。 不過就算對任務進行處理的順序真的很重要,也可以通過技術手段解決:只要給每個任務編個號就好了。 當一個任務完成時,檢查一下,如果還有其他編號比它小的任務沒完成,就先把它放置在這,等前面的任務都完成了再處理它。即使這樣,效率依然能比依次執行提升很多。

asynchronous 貌似現在效率已經挺高了。可歸根到底,在妹子們全部吃上飯之前,我還是得一直守在這不是? 就算找到空檔出去打了會醬油,也還得忐忑不安的隔三差五往回跑(因為我不知道妹子什麼時候會起來。萬一她已經起來了,可不能讓人家乾等著吃不上飯啊) 這種尷尬的局面就叫做同步。 (沒錯,上面的三種模型都屬於同步模型) 我當然不會止步於此。於是,我要到了所有妹子的手機號(作為一個紳士,我當然沒有別的意圖,嘿嘿)。 以後,只要“起床了!”一喊完,我就可以瀟灑的,頭也不回的愛幹什麼幹什麼了。 不管是在屋子裡掃地,還是跑出去維護世界和平,都行,完全不用考慮妹子們有沒有起來。 因為每個人起來時都會給我打電話,我只要在接到電話後回去就好了。 (什麼,萬一我跑得老遠了才接到電話,要怎麼回去?沒問題,電腦世界裡的上下文切換就跟瞬間移動似的。不管我走多遠,切換一次的耗時都是 O(1),不會線性增長)

總結 這四種模型中,前三種都是同步的。就是說我必須不斷主動的去跟進,妹子們起來了沒有?妹子們起來了沒有? 而最後一個模型稱之為異步模型。也就是我只負責通知,妹子們會在起床後主動聯繫我。這些模型的優缺點如下:blocking:流程簡單,但是效率低。在等待期間無事可做, 而且一次只能執行一個事件。non-blocking / multiplexing:既保持了流程的相對簡單,又提供了較好的運行效率。asynchronous:流程複雜,較難實現,但是效率最高。 這次就參考 stack overflow non blocking 使用 python3方式實現.

Code:

Get knowhow:

  • Non_blocking

Reference:

2016/10/25

下一篇:  Line Bot - Django - Platform to VPS

Leave a comment