首頁  >  文章  >  後端開發  >  python簡單線程和協程的實例詳解

python簡單線程和協程的實例詳解

PHP中文网
PHP中文网原創
2017-06-21 16:49:201515瀏覽

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

#threading庫可用來在單獨的執行緒中執行任意的python可調用物件。儘管此模組對執行緒相關操作的支援不夠,但是我們還是能夠用簡單的執行緒來處理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函數是用來開啟線程的,_stop函數是用來停止線程​​的。為了防止在線程中進行I/O操作時出現阻塞等問題,運行一段時間之後,可以判斷線程是否還存活,如果線程還存在就調用_stop()停止,防止阻塞(你可以將_stop函數封裝到類中,我這裡並沒有這麼做)。

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

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類別的方法,因為在多執行緒環境中這是不可靠的!對於簡單的小型的線程中資料的通信,可以使用佇列來處理。如果是大型的資料需要交互通信,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的自然語言處理來做情緒分析以及最熱的爬蟲程序,還有做炫的數據分析圖表。漸漸地,我就放下了那些,因為程式的重點不在那些,只要你會點基本的語法,看得懂官方文件就能夠做出來,而程式碼的重點在性能,優化。最大程度的寫出功能最完善,性能最優,結構最優美的程序,其實這就有點像是政治老師常說的"文化軟實力",程序中的"軟實力"應該是在程序中嵌入最適合的設計模式,做最完整的程式最佳化,採用最省效能的資料結構等.

以上是python簡單線程和協程的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn