欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

3天內不再提示

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

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

1. 使用內置模塊

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

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

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)建一個最大容納數量為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)

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

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 構造實例,同時傳入 max_workers 參數來設置線程池中最多能同時運行的線程數目。

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

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

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

2. 自定義線程池

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

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

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
...

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

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

    關注

    7

    文章

    2738

    瀏覽量

    47805
  • 函數
    +關注

    關注

    3

    文章

    4349

    瀏覽量

    63027
  • python
    +關注

    關注

    56

    文章

    4811

    瀏覽量

    85082
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    linux驅動程序的編譯方法有哪兩種

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

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

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

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

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

    探索虛擬線程:原理與實現

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

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

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

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

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

    數字設備中采集數字圖像的兩種方法是什么

    在數字設備中,采集數字圖像的方法有很多種,但最常見的兩種方法是:1) 使用數字相機拍攝,2) 通過掃描儀掃描。 一、使用數字相機拍攝 數字相機是一種可以捕捉圖像并將其轉換為數字格式的設備。數字相機
    的頭像 發(fā)表于 05-31 15:48 ?965次閱讀

    使用FreeRTOS創(chuàng)建的DHCP線程里面的DHCP是在哪里定義的?

    請教下,使用 FreeRTOS 創(chuàng)建的 DHCP 線程里面的 DHCP 是在哪里定義的,貌似沒有找到 ? FreeRTOS 版本 v9.0.0 具體如下: // 創(chuàng)建 DHCP 線程
    發(fā)表于 04-30 07:34

    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動任務)】

    任務(taskpool)作用是為應用程序提供一個多線程的運行環(huán)境,降低整體資源的消耗、提高系統(tǒng)的整體性能,且您無需關心線程實例的生命周期。您可以使用任務API
    的頭像 發(fā)表于 04-24 17:45 ?411次閱讀
    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動任務<b class='flag-5'>池</b>)】

    java實現多線程的幾種方式

    的CompletableFuture 一、繼承Thread類 繼承Thread類是實現多線程的最基本方式,只需創(chuàng)建一個類并繼承Thread類,重寫run()方法即可。 ``
    的頭像 發(fā)表于 03-14 16:55 ?793次閱讀

    python中5種線程鎖盤點

    線程安全是多線程或多進程編程中的一個概念,在擁有共享數據的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確
    發(fā)表于 03-07 11:08 ?1687次閱讀
    <b class='flag-5'>python</b>中5種<b class='flag-5'>線程</b>鎖盤點

    什么是動態(tài)線程?動態(tài)線程的簡單實現思路

    因此,動態(tài)可監(jiān)控線程一種針對以上痛點開發(fā)的線程管理工具。主要可實現功能有:提供對 Spring 應用內線程
    的頭像 發(fā)表于 02-28 10:42 ?736次閱讀

    RTT Nano線程創(chuàng)建成功,沒有進入線程創(chuàng)建的函數運行怎么解決?

    RTT Nano線程創(chuàng)建成功,沒有進入線程創(chuàng)建的函數運行int main(void) { interrupt_config(); // gd_eval_led_init(LED1
    發(fā)表于 02-26 06:27