国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python簡單線程和協(xié)程學習心得(分享)

2020-02-16 01:42:28
字體:
來源:轉載
供稿:網友

python中對線程的支持的確不夠,不過據說python有足夠完備的異步網絡框架模塊,希望日后能學習到,這里就簡單的對python中的線程做個總結

threading庫可用來在單獨的線程中執(zhí)行任意的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線程池來處理,而不是手動創(chuàng)建線程。如果線程間不需要共享變量的話,使用線程還是很方便的,可以減少很多的麻煩操作以及省時。如果需要在線程間進行通信,我們可以使用隊列來實現:

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類的方法,因為在多線程環(huán)境中這是不可靠的!對于簡單的小型的線程中數據的通信,可以使用隊列來處理。如果是大型的數據需要交互通信,python提供了相關的模塊你可以使用,具體的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()            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 锡林郭勒盟| 阳山县| 鹿泉市| 新竹县| 五台县| 鞍山市| 潜山县| 双柏县| 大丰市| 阿拉善右旗| 彭泽县| 定州市| 博爱县| 荔浦县| 新河县| 灵璧县| 城口县| 汝州市| 乌拉特前旗| 遂川县| 兴国县| 盖州市| 华宁县| 竹山县| 莱阳市| 仪征市| 昌乐县| 溧水县| 改则县| 馆陶县| 清水县| 泰来县| 通城县| 游戏| 西平县| 沂源县| 新沂市| 浦东新区| 克拉玛依市| 河南省| 绵阳市|