女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python創(chuàng)建線程池的兩種方法

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-16 16:15 ? 次閱讀

1. 使用內(nèi)置模塊

在使用多線程處理任務時也不是線程越多越好,由于在切換線程的時候,需要切換上下文環(huán)境,依然會造成cpu的大量開銷。為解決這個問題,線程池的概念被提出來了。預先創(chuàng)建好一個合理數(shù)量的線程池,讓過來的任務立刻能夠使用,就形成了線程池。

Python3中,創(chuàng)建線程池是通過concurrent.futures函數(shù)庫中的ThreadPoolExecutor類來實現(xiàn)的。

import time
import threading
from concurrent.futures import ThreadPoolExecutor

def target():
    for i in range(5):
        print('running thread-{}:{}'.format(threading.get_ident(), i))
        time.sleep(1)

# 創(chuàng)建一個最大容納數(shù)量為5的線程池
pool = ThreadPoolExecutor(5)

for i in range(10):
    # 往線程池上塞任務
    pool.submit(target)

創(chuàng)建線程池還可以使用更優(yōu)雅的方式,就是使用上下文管理器

with ThreadPoolExecutor(5) as pool:
    for i in range(100):
        pool.submit(target)

直接運行代碼,從輸出可以看出,前面我們設置線程池最大線程數(shù),會保證“同時”僅有五個線程在工作。

running thread-123145483767808:0
running thread-123145489022976:0
running thread-123145494278144:0
running thread-123145499533312:0
running thread-123145504788480:0
running thread-123145483767808:1
running thread-123145489022976:1
running thread-123145499533312:1
running thread-123145494278144:1
running thread-123145504788480:1
running thread-123145489022976:2
running thread-123145499533312:2
running thread-123145483767808:2
running thread-123145504788480:2
running thread-123145494278144:2
....

示例完畢,來說明一下:

使用 with 語句 ,通過 ThreadPoolExecutor 構(gòu)造實例,同時傳入 max_workers 參數(shù)來設置線程池中最多能同時運行的線程數(shù)目。

使用 submit 函數(shù)來提交線程需要執(zhí)行的任務到線程池中,并返回該任務的句柄(類似于文件、畫圖),注意 submit() 不是阻塞的,而是立即返回。

通過使用 done() 方法判斷該任務是否結(jié)束。上面的例子可以看出,提交任務后立即判斷任務狀態(tài),顯示四個任務都未完成。在延時2.5后,task1 和 task2 執(zhí)行完畢,task3 仍在執(zhí)行中。

使用 result() 方法可以獲取任務的返回值。

2. 自定義線程池

除了使用上述第三方模塊的方法之外,我們還可以自己結(jié)合前面所學的消息隊列來自定義線程池。

這里我們就使用queue來實現(xiàn)一個上面同樣效果的例子,大家感受一下。

import time
import threading
from queue import Queue

def target(queue):
    while True:
        task = queue.get()
        if task == "stop":
            queue.task_done()
            break

        task()
        queue.task_done()

def do_task():
    for i in range(5):
        print('running thread-{}:{}'.format(threading.get_ident(), i))
        time.sleep(1)


class MyQueue(Queue):
    def close(self):
        for i in range(self.maxsize):
            self.put("stop")

def custome_pool(task_func, max_workers):
    queue = MyQueue(max_workers)
    for n in range(max_workers):
        t = threading.Thread(target=task_func, args=(queue,))
        t.daemon = True
        t.start()

    return queue



pool = custome_pool(task_func=target, max_workers=5)

for i in range(10):
    pool.put(do_task)

pool.close()
pool.join()

輸出是和上面是完全一樣的效果

running thread-123145469886464:0
running thread-123145475141632:0
running thread-123145485651968:0
running thread-123145490907136:0
running thread-123145480396800:0
running thread-123145469886464:1
running thread-123145480396800:1
running thread-123145475141632:1
running thread-123145490907136:1
running thread-123145485651968:1
...

構(gòu)建線程池的方法,是可以很靈活的,大家有空可以自己多研究。但是建議只要掌握一種自己熟悉的,能快速上手的就好了。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2783

    瀏覽量

    49552
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4368

    瀏覽量

    64185
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86171
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    請問如何在Python中實現(xiàn)多線程與多進程的協(xié)作?

    大家好!我最近在開發(fā)一個Python項目時,需要同時處理多個任務,且每個任務需要不同的計算資源。我想通過多線程和多進程的組合來實現(xiàn)并發(fā),但遇到了一些問題。 具體來說,我有個任務,一個是I/O密集型
    發(fā)表于 03-11 06:57

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結(jié)果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在個推理過程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結(jié)果與 Python* 代碼不同。
    發(fā)表于 03-06 06:22

    Python中多線程和多進程的區(qū)別

    Python作為一種高級編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程
    的頭像 發(fā)表于 10-23 11:48 ?909次閱讀
    <b class='flag-5'>Python</b>中多<b class='flag-5'>線程</b>和多進程的區(qū)別

    比較分析兩種不同的可提高柵極驅(qū)動電流的方法

    電子發(fā)燒友網(wǎng)站提供《比較分析兩種不同的可提高柵極驅(qū)動電流的方法.pdf》資料免費下載
    發(fā)表于 09-23 11:13 ?0次下載
    比較分析<b class='flag-5'>兩種</b>不同的可提高柵極驅(qū)動電流的<b class='flag-5'>方法</b>

    買藥秒送 JADE動態(tài)線程實踐及原理淺析

    一、背景及JADE介紹 買藥秒送是健康即時零售業(yè)務新的核心流量場域,面對京東首頁高流量曝光,我們對頻道頁整個技術(shù)架構(gòu)方案進行升級,保障接口高性能、系統(tǒng)高可用。 動態(tài)線程是買藥頻道應用的技術(shù)之一
    的頭像 發(fā)表于 09-04 11:11 ?1096次閱讀
    買藥秒送 JADE動態(tài)<b class='flag-5'>線程</b><b class='flag-5'>池</b>實踐及原理淺析

    linux驅(qū)動程序的編譯方法有哪兩種

    Linux驅(qū)動程序的編譯方法主要可以歸納為兩種: 手動編譯 和 使用內(nèi)核構(gòu)建系統(tǒng)(Makefile)自動編譯 。 1. 手動編譯 手動編譯驅(qū)動程序通常涉及直接使用GCC(GNU Compiler
    的頭像 發(fā)表于 08-30 14:39 ?1366次閱讀

    邏輯函數(shù)的化簡方法有哪兩種

    邏輯函數(shù)的化簡是數(shù)字電路設計中的重要步驟,它有助于減少電路中的門數(shù)量,提高電路的性能和可靠性。邏輯函數(shù)的化簡方法主要可以分為大類: 公式化簡法 : 代數(shù)法 :利用布爾代數(shù)的公理、定理和規(guī)則(如德
    的頭像 發(fā)表于 08-22 16:40 ?2203次閱讀

    利用Python腳本登錄到交換機并創(chuàng)建VLAN

    本文將詳細介紹如何利用Python腳本登錄到交換機并創(chuàng)建VLAN。
    的頭像 發(fā)表于 08-12 17:59 ?858次閱讀

    一文掌握Python線程

    使用線程可以把占據(jù)長時間的程序中的任務放到后臺去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1182次閱讀

    地物光譜儀的兩種天空光測量方法比較

    地物光譜儀的兩種天空光測量方法比較天空光是指太陽光經(jīng)過大氣分子及大氣氣溶膠散射后經(jīng)任意方向到達地面的輻射。
    的頭像 發(fā)表于 07-29 14:40 ?869次閱讀
    地物光譜儀的<b class='flag-5'>兩種</b>天空光測量<b class='flag-5'>方法</b>比較

    rtt工程移植后線程創(chuàng)建不成功怎么解決?

    之前用l431的板子跑10k的采樣后來要提高到100k,更換了f446的芯片,但是根據(jù)新的內(nèi)存地址從0x20000000開始寫入數(shù)據(jù)后,線程創(chuàng)建不成功了,不知道是否是線程的的大小不
    發(fā)表于 07-18 06:44

    如何在espconn_gethostbyname上創(chuàng)建阻塞線程

    在 espconn_gethostbyname 上創(chuàng)建阻塞線程
    發(fā)表于 07-10 07:45

    探索虛擬線程:原理與實現(xiàn)

    虛擬線程的引入與優(yōu)勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現(xiàn)的,這些線程被稱為平臺線程。 然而,平臺
    的頭像 發(fā)表于 06-24 11:35 ?520次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現(xiàn)

    鴻蒙開發(fā):【線程模型】

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務創(chuàng)建任務或取消任務、啟動和終止Worker線程
    的頭像 發(fā)表于 06-13 16:38 ?657次閱讀
    鴻蒙開發(fā):【<b class='flag-5'>線程</b>模型】

    動態(tài)線程思想學習及實踐

    相關(guān)文檔 美團線程實踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線程思想解
    的頭像 發(fā)表于 06-13 15:43 ?1470次閱讀
    動態(tài)<b class='flag-5'>線程</b><b class='flag-5'>池</b>思想學習及實踐