欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲程序中使用生產(chǎn)者與消費者模式時進程過早退出的問題

 更新時間:2023年01月06日 10:34:18   作者:smart_cat  
本文主要介紹了Python爬蟲程序中使用生產(chǎn)者與消費者模式時進程過早退出的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

之前寫爬蟲程序的時候,采用生產(chǎn)者和消費者的模式,利用Queue作為生產(chǎn)者進程和消費者進程之間的同步隊列。

執(zhí)行程序時,總是秒退,加了斷點也無法中斷,加打印也無法輸出,我知道肯定是進程退出了,但還是百思不得解,為什么會這么快就退出。

一開始以為是我的進程代碼寫的有問題,在某個地方崩潰導(dǎo)致程序提前退出,排查了一遍又一遍,并沒有發(fā)現(xiàn)什么明顯的問題,后來走讀代碼,看到主模塊中消費者和生產(chǎn)者進程的啟動后,發(fā)現(xiàn)了問題,原因是我通過start()方法啟動進程后,使用join()的方式有問題。消費者進程必須執(zhí)行join()操作,否則消費者進程將在有時間完成所有工作之前被終止。

錯誤的示范:

queue = multiprocessing.JoinableQueue()
consumer = PageContentConsumer(queue)
consumer.start()

producer = PageContentProducer(queue)
producer.start()

# 想通過queue的join()方法確保queue中的元素都被處理完畢
# 但從實際運行看,消費者進程還沒來得及處理就退出了
queue.join()

正確的示范:

queue = multiprocessing.JoinableQueue()
consumer = PageContentConsumer(queue)
consumer.start()

producer = PageContentProducer(queue)
producer.start()
# 需要執(zhí)行producer.join(),確保生產(chǎn)者進程能夠持續(xù)執(zhí)行
producer.join()

# 需要執(zhí)行consumer.join(),確保消費者進程有時間進行處理
consumer.join()

# 通過queue的join()方法確保queue中的元素都被處理完畢, 這一步可選,因為真實代碼里放了隊列完成標(biāo)志
queue.join()

生產(chǎn)者進程示意代碼:

class PageContentProducer(multiprocessing.Process):
? ? def __init__(self, page_list:list, output_queue:multiprocessing.JoinableQueue):
? ? ? ? multiprocessing.Process.__init__(self)
? ? ? ? self.daemon = True
? ? ? ? self.page_list = page_list
? ? ? ? self.content_list = [] ?# 用于保存匯總信息,沒有什么實際作用
? ? ? ? self.output_queue = output_queue
? ??
? ? def run(self):
? ? ? ? '''
? ? ? ? 向隊列中加入每一篇文章
? ? ? ? '''
? ? ? ? self.visit_all_page_to_get_content()
? ? ? ??
? ? def visit_all_page_to_get_content(self):
? ? ? ? '''
? ? ? ? 使用線程池處理所有的page, 并從每一頁上提取所有的文章content
? ? ? ? '''
? ? ? ? ...

消費者進程示意代碼:

class PageContentConsumer(multiprocessing.Process):
? ? def __init__(self, dir, input_queue:multiprocessing.JoinableQueue):
? ? ? ? multiprocessing.Process.__init__(self)
? ? ? ? self.daemon = True
? ? ? ? self.input_queue = input_queue
? ? ? ? self.dir = dir
? ? ? ??
? ? def run(self):
? ? ? ? while True:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? content = self.input_queue.get()
? ? ? ? ? ? ? ? if content is None:
? ? ? ? ? ? ? ? ? ? # 如果收到結(jié)束標(biāo)志, 就退出當(dāng)前任務(wù)
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? self.content_worker_func(self.dir, content)
? ? ? ? ? ? ? ? print(f"已處理: {content['title']}")
? ? ? ? ? ? ? ? # 發(fā)出信號通知任務(wù)完成
? ? ? ? ? ? ? ? self.input_queue.task_done()
? ? ? ? ? ? except Exception as e:
? ? ? ? ? ? ? ? print(repr(e))
? ? ? ? ? ? ? ??
? ? def content_worker_func(self, dir, content):
? ? ? ? '''
? ? ? ? 主要工作函數(shù)
? ? ? ? '''
? ? ? ? ...

主模塊代碼示意如下:

if __name__ == '__main__':
? ? page_list = [xxxx]
? ??
? ? queue = multiprocessing.JoinableQueue()
? ??
? ? consumer_num = os.cpu_count()
? ? consumers = []
? ??
? ? for i in range(0, consumer_num):
? ? ? ? consumers.append(PageContentConsumer(dir, queue))
? ??
? ? for i in range(0, consumer_num):
? ? ? ? consumers[i].start()
? ??
? ? producer = PageContentProducer(page_list, queue)
? ? producer.start()
? ? producer.join()
? ??
? ? # 在隊列上放置標(biāo)志,發(fā)出完成信號, 有幾個消費者,就需要放置多少個標(biāo)志
? ? for i in range(0, consumer_num):
? ? ? ? queue.put(None)
? ? ? ??
? ? # 等待消費者進程關(guān)閉
? ? for i in range(0, consumer_num):
? ? ? ? consumers[i].join()

到此這篇關(guān)于Python爬蟲程序中使用生產(chǎn)者與消費者模式時進程過早退出的問題的文章就介紹到這了,更多相關(guān)Python生產(chǎn)者與消費者模式進程早退內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)計算長方形面積(帶參數(shù)函數(shù)demo)

    Python實現(xiàn)計算長方形面積(帶參數(shù)函數(shù)demo)

    今天小編就為大家分享一篇Python實現(xiàn)計算長方形面積(帶參數(shù)函數(shù)demo),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 對Python 網(wǎng)絡(luò)設(shè)備巡檢腳本的實例講解

    對Python 網(wǎng)絡(luò)設(shè)備巡檢腳本的實例講解

    下面小編就為大家分享一篇對Python 網(wǎng)絡(luò)設(shè)備巡檢腳本的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python @classmethod 的使用場合詳解

    python @classmethod 的使用場合詳解

    這篇文章主要介紹了python @classmethod 的使用場合詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 使用Dajngo 通過代碼添加xadmin用戶和權(quán)限(組)

    使用Dajngo 通過代碼添加xadmin用戶和權(quán)限(組)

    這篇文章主要介紹了使用Dajngo 通過代碼添加xadmin用戶和權(quán)限(組),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • python基礎(chǔ)面試題整理

    python基礎(chǔ)面試題整理

    這篇文章主要介紹了python基礎(chǔ)面試題整理,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • python 普通克里金(Kriging)法的實現(xiàn)

    python 普通克里金(Kriging)法的實現(xiàn)

    這篇文章主要介紹了python 普通克里金(Kriging)法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • python中Genarator函數(shù)用法分析

    python中Genarator函數(shù)用法分析

    這篇文章主要介紹了python中Genarator函數(shù)用法,實例分析了Genarator函數(shù)的使用原理與相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • Apache如何部署django項目

    Apache如何部署django項目

    這篇文章主要介紹了Apache如何部署django項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Python閉包執(zhí)行時值的傳遞方式實例分析

    Python閉包執(zhí)行時值的傳遞方式實例分析

    這篇文章主要介紹了Python閉包執(zhí)行時值的傳遞方式,結(jié)合實例形式分析了Python閉包執(zhí)行時的傳值原理與實現(xiàn)方式,代碼中包含了較為詳盡的注釋便于理解,需要的朋友可以參考下
    2018-06-06
  • python工廠方法模式原理與實現(xiàn)

    python工廠方法模式原理與實現(xiàn)

    大家好,本篇文章主要講的是python工廠方法模式原理與實現(xiàn),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評論