python中對線程的支持的確不夠,不過據(jù)說python有足夠完備的異步網(wǎng)絡框架模塊,希望日后能學習到,這里就簡單的對python中的線程做個總結(jié)
threading庫可用來在單獨的線程中執(zhí)行任意的python可調(diào)用對象。盡管此模塊對線程相關(guān)操作的支持不夠,但是我們還是能夠用簡單的線程來處理I/O操作,以減低程序響應時間。
from threading import Thread import 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函數(shù)是用來開啟線程的,_stop函數(shù)是用來停止線程的。為了防止在線程中進行I/O操作時出現(xiàn)阻塞等問題,運行一段時間之后,可以判斷線程是否還存活,如果線程還存在就調(diào)用_stop()停止,防止阻塞(你可以將_stop函數(shù)封裝到類中,我這里并沒有這么做)。
當然,你可以調(diào)用ThreadPool線程池來處理,而不是手動創(chuàng)建線程。如果線程間不需要共享變量的話,使用線程還是很方便的,可以減少很多的麻煩操作以及省時。如果需要在線程間進行通信,我們可以使用隊列來實現(xiàn):
from queue import Queue from 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類的方法,因為在多線程環(huán)境中這是不可靠的!對于簡單的小型的線程中數(shù)據(jù)的通信,可以使用隊列來處理。如果是大型的數(shù)據(jù)需要交互通信,python提供了相關(guān)的模塊你可以使用,具體的u need baidu.
所謂協(xié)程,其實就是在單線程的環(huán)境下的yield程序。
from collections import deque def countdown(n): while n > 0: print("T-minus", n) yield # 返回之后下次直接從這里執(zhí)行...相當于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的自然語言處理來做情感分析以及最熱的爬蟲程序,還有做炫的數(shù)據(jù)分析圖表。漸漸地,我就放下了那些,因為程序的重點不在那些,只要你會點基本的語法,看得懂官方文檔就能夠做出來,而程序代碼的重點在性能,優(yōu)化。最大程度的寫出功能最完善,性能最優(yōu),結(jié)構(gòu)最優(yōu)美的程序,其實這就有點像是政治老師常說的"文化軟實力",程序中的"軟實力"應該是在程序中嵌入最適合的設(shè)計模式,做最完備的程序優(yōu)化,采用最省性能的數(shù)據(jù)結(jié)構(gòu)等。
以上這篇python簡單線程和協(xié)程學習心得(分享)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
