最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

錯(cuò)誤的示范:

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

producer = PageContentProducer(queue)
producer.start()

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

正確的示范:

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

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

# 需要執(zhí)行consumer.join(),確保消費(fèi)者進(jìn)程有時(shí)間進(jìn)行處理
consumer.join()

# 通過queue的join()方法確保queue中的元素都被處理完畢, 這一步可選,因?yàn)檎鎸?shí)代碼里放了隊(duì)列完成標(biāo)志
queue.join()

生產(chǎn)者進(jì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 = [] ?# 用于保存匯總信息,沒有什么實(shí)際作用
? ? ? ? self.output_queue = output_queue
? ??
? ? def run(self):
? ? ? ? '''
? ? ? ? 向隊(duì)列中加入每一篇文章
? ? ? ? '''
? ? ? ? self.visit_all_page_to_get_content()
? ? ? ??
? ? def visit_all_page_to_get_content(self):
? ? ? ? '''
? ? ? ? 使用線程池處理所有的page, 并從每一頁上提取所有的文章content
? ? ? ? '''
? ? ? ? ...

消費(fèi)者進(jìn)程示意代碼:

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()
? ??
? ? # 在隊(duì)列上放置標(biāo)志,發(fā)出完成信號, 有幾個(gè)消費(fèi)者,就需要放置多少個(gè)標(biāo)志
? ? for i in range(0, consumer_num):
? ? ? ? queue.put(None)
? ? ? ??
? ? # 等待消費(fèi)者進(jìn)程關(guān)閉
? ? for i in range(0, consumer_num):
? ? ? ? consumers[i].join()

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

相關(guān)文章

  • Python常見錯(cuò)誤:IndexError:?list?index?out?of?range解決

    Python常見錯(cuò)誤:IndexError:?list?index?out?of?range解決

    最近在寫一個(gè)爬蟲程序,但是卻出現(xiàn)了錯(cuò)誤提示IndexError:?list?index?out?of?range,所以下面這篇文章主要給大家介紹了關(guān)于Python常見錯(cuò)誤:IndexError:?list?index?out?of?range的解決方法,需要的朋友可以參考下
    2023-01-01
  • Python+Pygame實(shí)戰(zhàn)之炫舞小游戲的實(shí)現(xiàn)

    Python+Pygame實(shí)戰(zhàn)之炫舞小游戲的實(shí)現(xiàn)

    提到QQ炫舞,可能很多人想到的第一個(gè)詞是“青春”。恍然間,這個(gè)承載了無數(shù)人回憶與時(shí)光的游戲品牌,已經(jīng)走到了第十幾個(gè)年頭。今天小編就來給大家嘗試做一款簡單的簡陋版的小游戲——《舞動(dòng)青春*炫舞》,感興趣的可以了解一下
    2022-12-12
  • pandas apply多線程實(shí)現(xiàn)代碼

    pandas apply多線程實(shí)現(xiàn)代碼

    這篇文章主要介紹了pandas apply多線程實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 解決Python命令行下退格,刪除,方向鍵亂碼(親測有效)

    解決Python命令行下退格,刪除,方向鍵亂碼(親測有效)

    今天小編就為大家分享一篇解決Python命令行下退格,刪除,方向鍵亂碼(親測有效),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python 中os模塊os.path.exists()的用法說明

    python 中os模塊os.path.exists()的用法說明

    這篇文章主要介紹了python 中os模塊os.path.exists()的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python的scrapy框架之Pipeline文件的用法詳解

    python的scrapy框架之Pipeline文件的用法詳解

    這篇文章主要介紹了python的scrapy框架之Pipeline文件的用法詳解,Pipeline是一個(gè)獨(dú)立的模塊,用于處理從Spider中提取的Item對象,實(shí)現(xiàn)對數(shù)據(jù)的進(jìn)一步處理、存儲和清洗等操作,下面將詳細(xì)介紹Scrapy框架中Pipeline的用法,需要的朋友可以參考下
    2023-10-10
  • 用python給csv里的數(shù)據(jù)排序的具體代碼

    用python給csv里的數(shù)據(jù)排序的具體代碼

    在本文里小編給大家分享的是關(guān)于用python給csv里的數(shù)據(jù)排序的具體代碼內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法

    Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法

    這篇文章主要介紹了Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法,涉及Python針對日期時(shí)間的轉(zhuǎn)換與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • Python實(shí)現(xiàn)單例模式的五種寫法總結(jié)

    Python實(shí)現(xiàn)單例模式的五種寫法總結(jié)

    單例模式(Singleton Pattern) 是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)類只有一個(gè)實(shí)例存在。本文為大家整理了五種Python實(shí)現(xiàn)單例模式的寫法,需要的可以參考一下
    2022-08-08
  • Python構(gòu)造函數(shù)及解構(gòu)函數(shù)介紹

    Python構(gòu)造函數(shù)及解構(gòu)函數(shù)介紹

    這篇文章主要介紹了Python構(gòu)造函數(shù)及解構(gòu)函數(shù)介紹,本文只是講解構(gòu)造及解構(gòu)函數(shù)的簡單知識,需要的朋友可以參考下
    2015-02-02

最新評論

广灵县| 崇文区| 荃湾区| 隆德县| 黄冈市| 阿巴嘎旗| 嘉义市| 和政县| 广平县| 左云县| 东光县| 永寿县| 得荣县| 东阿县| 彝良县| 建阳市| 东海县| 蒲城县| 轮台县| 台南市| 兴仁县| 东阳市| 开江县| 泰宁县| 沿河| 南召县| 玉树县| 博湖县| 固始县| 通辽市| 新巴尔虎右旗| 凭祥市| 水富县| 枣庄市| 水城县| 张北县| 宜春市| 九龙城区| 河源市| 加查县| 镇雄县|