日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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)置模塊

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

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):
    # 往線程池上塞任務(wù)
    pool.submit(target)

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

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

直接運行代碼,從輸出可以看出,前面我們設(shè)置線程池最大線程數(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è)置線程池中最多能同時運行的線程數(shù)目。

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

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

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

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

    文章

    2849

    瀏覽量

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

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67870
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4889

    瀏覽量

    90330
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    使用Python/MyHDL創(chuàng)建自定義FPGA IP

    使用 Python/MyHDL 創(chuàng)建自定義 FPGA IP,與 Vivado 集成,并通過 PYNQ 進行控制——實現(xiàn)軟件上的簡單硬件設(shè)計。
    的頭像 發(fā)表于 04-09 09:53 ?288次閱讀
    使用<b class='flag-5'>Python</b>/MyHDL<b class='flag-5'>創(chuàng)建</b>自定義FPGA IP

    使用PYTHON進行的跨平臺仿真

    快速物理光學軟件VirtualLab Fusion以其“連接場求解器”方法而自豪,該方法將應(yīng)用于不同組件上的專用電磁場求解器結(jié)合在一起,以實現(xiàn)整個系統(tǒng)的物理光學模擬。這種方法的邏輯擴展不僅是連接軟件
    發(fā)表于 04-02 08:21

    生產(chǎn)環(huán)境數(shù)據(jù)庫連接耗盡的全流程排查與性能優(yōu)化實戰(zhàn)

    數(shù)據(jù)庫連接是應(yīng)用程序與數(shù)據(jù)庫之間的緩存連接組件。連接在應(yīng)用程序啟動時創(chuàng)建一組數(shù)據(jù)庫連接,應(yīng)用程序從連接獲取連接,使用完畢后歸還連接
    的頭像 發(fā)表于 03-27 15:58 ?347次閱讀

    Linux多線程對比單線程的優(yōu)勢

    的示例代碼,創(chuàng)建三個線程,每個線程實現(xiàn)不同的任務(wù):#include #include void *task1(void *arg) { printf(\"Thread 1
    發(fā)表于 12-01 06:11

    用PLC實現(xiàn)卷徑計算的兩種算法

    卷徑計算,是動態(tài)計算如鋼卷,紙卷等存料量的一種方法,它是實現(xiàn)張力控制和自動充放料、以及甩尾控制的重要前提。卷徑計算目前主流的方法兩種,一種是根據(jù)機列速度(產(chǎn)線速度)和和被測卷的轉(zhuǎn)動角速度求得;另一種是根據(jù)被測卷的轉(zhuǎn)動圈數(shù)和測長
    的頭像 發(fā)表于 11-14 16:54 ?2610次閱讀
    用PLC實現(xiàn)卷徑計算的<b class='flag-5'>兩種</b>算法

    有多少種方法可以進行頻響曲線測量?

    APx500軟件提供了頻響曲線的多種測量方法,對一個音頻產(chǎn)品的頻響特性進行測量分析。如果只用一個測量對一個音頻產(chǎn)品進行評價,那這個測量就是頻響曲線,APx500軟件提供了多種方法可以進行頻響曲線測量
    的頭像 發(fā)表于 11-14 11:29 ?1251次閱讀
    有多少<b class='flag-5'>種方法</b>可以進行頻響曲線測量?

    RTThread線程退出后rt_malloc動態(tài)創(chuàng)建的資源沒有釋放怎么解決?

    測試過程中,在一個線程中用rt_malloc動態(tài)創(chuàng)建4KB的資源,在線程運行過程中用rt_thread_delete()使線程退出,用memtrace查看內(nèi)存分配情況,動態(tài)
    發(fā)表于 10-13 07:06

    線程問題,線程已經(jīng)創(chuàng)建成功了,為什么線程調(diào)用的函數(shù)不會運行呢?

    我這個線程創(chuàng)建成功了,為啥ai_thread_entry()函數(shù)不運行呢? void airun_thread() { /* 創(chuàng)建 serial 線程 */ rt_thread_
    發(fā)表于 10-10 08:02

    RT-Thread Nano移植后動態(tài)創(chuàng)建線程創(chuàng)建不了怎么解決?

    RT-Thread Nano 移植后動態(tài)創(chuàng)建線程創(chuàng)建不了,靜態(tài)可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動態(tài)創(chuàng)建創(chuàng)建
    發(fā)表于 09-19 06:28

    rtth studio中nano 如何創(chuàng)建動態(tài)線程?

    有沒有大佬,可以說一下為什么靜態(tài)線程可以正常使用,動態(tài)線程怎么也使用不了。 具體需要什么配置才能使用動態(tài)線程創(chuàng)建。謝謝!
    發(fā)表于 09-11 06:01

    【HZ-T536開發(fā)板免費體驗】—— linux創(chuàng)建線程

    的執(zhí)行任務(wù)成為單線程。多線程是程序中包含多個執(zhí)行流,在一個程序中可以同時運行多個不同的線程來執(zhí)行不同的任務(wù)。 多線程提高了CPU的使用鹵率。多線程
    發(fā)表于 09-01 21:31

    rtt studio中nano 如何創(chuàng)建動態(tài)線程

    有沒有大佬,可以說一下為什么靜態(tài)線程可以正常使用,動態(tài)線程怎么也使用不了。 具體需要什么配置才能使用動態(tài)線程創(chuàng)建。謝謝!
    發(fā)表于 08-22 06:19

    如何移植 RT-Thread Nano 并創(chuàng)建 2 個線程?

    基于 BSP 中的 GPIO_OutputInput 演示,展示了如何移植 RT-Thread Nano 并創(chuàng)建 2 個線程。
    發(fā)表于 08-19 07:45

    RT-Thread Nano移植后動態(tài)創(chuàng)建線程創(chuàng)建不了怎么處理?

    RT-Thread Nano移植后動態(tài)創(chuàng)建線程創(chuàng)建不了,靜態(tài)可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動態(tài)創(chuàng)建創(chuàng)建
    發(fā)表于 06-11 06:36

    六相永磁同步電機串聯(lián)系統(tǒng)控制的兩種方法分析研究

    /simulink環(huán)境下,分別用這兩種方法臺電機串聯(lián)系統(tǒng)的運行特性進行仿真研究。當其中一臺電機轉(zhuǎn)速、負載變化時,分析兩種方法下另外一臺電機獨立運行的情況,臉證分析這兩種方法的可行性
    發(fā)表于 06-10 13:09
    崇文区| 青州市| 将乐县| 临朐县| 姜堰市| 芦溪县| 巍山| 高州市| 东兰县| 沈阳市| 柳江县| 兴海县| 徐汇区| 曲水县| 南宫市| 定陶县| 梧州市| 宁强县| 牟定县| 宜兰市| 奇台县| 宣化县| 黄山市| 鸡西市| 黑山县| 东城区| 柯坪县| 甘孜| 靖州| 工布江达县| 基隆市| 弥勒县| 德兴市| 井陉县| 泽州县| 凤山县| 应用必备| 安乡县| 灵武市| 博爱县| 甘孜县|