總結python中的線程與協程

來源:互聯網
上載者:User
下面小編就為大家帶來一篇python簡單線程和協程學習心得(分享)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

python中對線程的支援的確不夠,不過據說python有足夠完備的非同步網路架構模組,希望日後能學習到,這裡就簡單的對python中的線程做個總結

threading庫可用來在單獨的線程中執行任意的python可調用對象。儘管此模組對線程相關操作的支援不夠,但是我們還是能夠用簡單的線程來處理I/O操作,以減低程式回應時間。

from threading import Threadimport time  def countdown(n):  while n > 0:    print('T-minus:', n)    n -= 1  t = Thread(target=countdown, args=(10,))t.start() # 開啟線程 time.sleep(2) if t.is_alive() is True:  print("停止線程...")  t._stop() # 停止線程

start函數是用來開啟線程的,_stop函數是用來停止線程的。為了防止線上程中進行I/O操作時出現阻塞等問題,運行一段時間之後,可以判斷線程是否還存活,如果線程還存在就調用_stop()停止,防止阻塞(你可以將_stop函數封裝到類中,我這裡並沒有這麼做)。

當然,你可以調用ThreadPool線程池來處理,而不是手動建立線程。如果線程間不需要共用變數的話,使用線程還是很方便的,可以減少很多的麻煩操作以及省時。如果需要線上程間進行通訊,我們可以使用隊列來實現:

from queue import Queuefrom threading import Thread  class kill:  def terminate(self, t):    if t.isAlive is True:      t._stop()  def product(out_q):  for i in range(5):      out_q.put(i)  def consumer(in_q):  for i in range(5):    print(in_q.get())  q = Queue()t1 = Thread(target=consumer, args=(q,))t2 = Thread(target=product, args=(q,))t1.start()t2.start()  k = kill() # 查詢線程是否終止,防止阻塞...k.terminate(t1)k.terminate(t2)

Queue執行個體會被所有的線程共用,同時它又擁有了所有所需要的鎖,因此它們可以安全的在任意多的線程中共用。在這裡要注意,不要再多線程中使用除了put(),get()方法之外的queue類的方法,因為在多線程環境中這是不可靠的!對於簡單的小型的線程中資料的通訊,可以使用隊列來處理。如果是大型的資料需要互動通訊,python提供了相關的模組你可以使用,具體的u need baidu.

所謂協程,其實就是在單線程的環境下的yield程式。


from collections import deque  def countdown(n):  while n > 0:    print("T-minus", n)    yield # 返回之後下次直接從這裡執行...相當於C#裡面得yield return .    n -= 1  print("this is countdown!!!")  def countup(n):  x = 0  while x < n:    print("Counting up", x)    yield    x += 1  class TaskScheduler:  def init(self):    self._task_queue = deque()   def new_task(self, task):    self._task_queue.append(task)   def run(self):    while self._task_queue:      task = self._task_queue.popleft()      try:        next(task)        self._task_queue.append(task)      except StopIteration:        pass  sche = TaskScheduler()sche.new_task(countdown(10))sche.new_task(countdown(5))sche.new_task(countup(15))sche.run()

在這裡說下自己這段時間使用python的心得,python的確不錯,但效能也是為人詬病,一開始學習python,我也是去做一些比較炫的程式,最起碼聽起來逼格高,比如使用python的自然語言處理來做情感分析以及最熱的爬蟲程式,還有做炫的資料分析圖表。漸漸地,我就放下了那些,因為程式的重點不在那些,只要你會點基本的文法,看得懂官方文檔就能夠做出來,而程式碼的重點在效能,最佳化。最大程度的寫出功能最完善,效能最優,結構最優美的程式,其實這就有點像是政治老師常說的"文化軟實力",程式中的"軟實力"應該是在程式中嵌入最適合的設計模式,做最完備的程式最佳化,採用最省效能的資料結構等。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.