真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中queue庫(kù)如何使用

今天就跟大家聊聊有關(guān)Python中queue庫(kù)如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司為客戶提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開(kāi)發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開(kāi)發(fā)、WEB系統(tǒng)開(kāi)發(fā)、微信二次開(kāi)發(fā)、手機(jī)網(wǎng)站開(kāi)發(fā)等網(wǎng)站方面業(yè)務(wù)。

queue模塊提供了適合多線程編程的先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),可以用來(lái)在生產(chǎn)者和消費(fèi)者線程之間安全的傳遞消息或者數(shù)據(jù);鎖是調(diào)用方處理,因此多線程可以安全、方便的使用同一隊(duì)列實(shí)現(xiàn)。

FIFO 隊(duì)列

Queue類,實(shí)現(xiàn)了最基礎(chǔ)的先進(jìn)先出隊(duì)列,使用put方法,將元素添加到末尾,使用get方法將元素從另一邊刪除

def queue_fifo():
   q = queue.Queue()
   for i in range(5):
       q.put(i)

   while not q.empty():
       print (q.get(), end = ' ')
   print ()

LIFO 棧

與標(biāo)準(zhǔn)的FIFO隊(duì)列不同,LifoQueue實(shí)現(xiàn)了后進(jìn)先出,這通常是棧;

def queue_lifo():
   q = queue.LifoQueue()
   for i in range(5):
       q.put(i)

   while not q.empty():
       print (q.get(), end = ' ')
   print ()

優(yōu)先級(jí)隊(duì)列

有時(shí),隊(duì)列中元素的處理順序需要基于這些元素的特征,而不僅僅是添加到隊(duì)列中的順序。例如,財(cái)務(wù)部門(mén)的打印作業(yè)可能優(yōu)先于開(kāi)發(fā)人員的代碼列表打印。PriorityQueue使用隊(duì)列內(nèi)容的排序順序來(lái)決定要檢索的元素。

class Job():
   def __init__(self, priority, description):
       self.priority = priority
       self.description = description
       print (description)
       return

   def __eq__(self, other):
       return self.priority == other.priority

   def __lt__(self, other):
       return self.priority < other.priority

def priority_queue():
   import threading
   print ('initial')
   q = queue.PriorityQueue()
   q.put(Job(5, 'Mid Job'))
   q.put(Job(10, 'Low Job'))
   q.put(Job(1, 'Imp Job'))

   def process_job(q):
       while True:
           next_job = q.get()
           print (next_job.description)
           q.task_done()
   workers = [
       threading.Thread(target=process_job, args=(q, )),
       threading.Thread(target=process_job, args=(q, )),
   ]
   print ('get')
   for w in workers:
       w.setDaemon(True)
       w.start()
   q.join()

Queue與多線程實(shí)戰(zhàn)

本節(jié)播放客戶端的源代碼演示Queue和多線程一起使用的場(chǎng)景。該程序讀取一個(gè)或多個(gè)RSS 摘要,將每一個(gè)摘要中五個(gè)最新事件放入Queue中等待下載,使用多線程并行處理下載。該框架實(shí)現(xiàn)演示了queue模塊的使用。

def podcast_client():
   ### 0. 初始化
   import threading
   num_fetch_threads = 2
   enclosure_queue = queue.Queue()
   feed_urls = [
       'http://talkpython.fm/episodes/rss',
   ]

   ### 1. 輔助函數(shù)打印信息
   def message(s):
       print ('{}: {}'.format(threading.current_thread().name, s))

   ### 2. 多線程目標(biāo)函數(shù)函數(shù)
   def download_enclosures(q):
       import urllib
       message('looking for the next enclosure')
       url = q.get()
       filename = url.rpartition('/')[-1]
       message('downloading {}'.format(filename))
       response = urllib.request.urlopen(url)
       data = response.read()
       message('writing to {}'.format(filename))
       with open(filename, 'wb') as outfile:
           outfile.write(data)
       q.task_done()

   ### 3. 啟動(dòng)多線程
   for i in range(num_fetch_threads):
       worker = threading.Thread(
           target = download_enclosures,
           args = (enclosure_queue, ),
           name = 'work-{}'.format(i),
       )
       worker.setDaemon(True)
       worker.start()

   ### 4. 隊(duì)列中添加URL
   import feedparser
   from urllib.parse import urlparse
   for url in feed_urls:
       response = feedparser.parse(url, agent='queue_module.py')
       for entry in response['entries'][:5]:
           for enclosure in entry.get('enclosures', []):
               parsed_url = urlparse(enclosure['url'])
               message('queuing {}'.format(
                   parsed_url.path.rpartition('/')[-1]))
               enclosure_queue.put(enclosure['url'])

   ### 5. 主線程
   message('*** main thread waiting')
   enclosure_queue.join()
   message('*** done')

首先,進(jìn)行參數(shù)初始化,確定操作參數(shù):通常來(lái)自于用戶輸入。該示例使用硬編碼值,表示要獲取的線程數(shù)和URL列表,并創(chuàng)建用來(lái)打印信息的輔助函數(shù)message

在work線程中執(zhí)行download_enclosures方法,使用urllib處理下載。線程中定義了目標(biāo)函數(shù)后,就可以啟動(dòng)工作:download_enclosures方法中,語(yǔ)句url=q.get()執(zhí)行時(shí),會(huì)阻塞并等待隊(duì)列返回內(nèi)容,這意味著在隊(duì)列沒(méi)有任何內(nèi)容之前啟動(dòng)線程是安全的。

下一步是使用feedparser模塊(需要安裝)檢索摘要內(nèi)容,并將url插入到隊(duì)列中。一旦URL被添加到隊(duì)列中,線程就會(huì)將其讀取并開(kāi)始下載,循環(huán)往隊(duì)列中添加元素,直到摘要消耗完,工作線程輪流講url出隊(duì)列下載。

看完上述內(nèi)容,你們對(duì)Python中queue庫(kù)如何使用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


分享題目:Python中queue庫(kù)如何使用
網(wǎng)頁(yè)地址:http://weahome.cn/article/pideip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部