chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2822

    瀏覽量

    52804
  • 函數(shù)
    +關注

    關注

    3

    文章

    4406

    瀏覽量

    66845
  • python
    +關注

    關注

    57

    文章

    4858

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    的示例代碼,創(chuàng)建三個線程,每個線程實現(xiàn)不同的任務:#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 ?1380次閱讀
    用PLC實現(xiàn)卷徑計算的<b class='flag-5'>兩種</b>算法

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

    APx500軟件提供了頻響曲線的多種測量方法,對一個音頻產(chǎn)品的頻響特性進行測量分析。如果只用一個測量對一個音頻產(chǎn)品進行評價,那這個測量就是頻響曲線,APx500軟件提供了多種方法可以進行頻響曲線測量
    的頭像 發(fā)表于 11-14 11:29 ?313次閱讀
    有多少<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í)行任務成為單線程。多線程是程序中包含多個執(zhí)行流,在一個程序中可以同時運行多個不同的線程來執(zhí)行不同的任務。 多線程提高了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

    進程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    保存寄存器和棧指針(就像你下班時關燈、鎖門) 死鎖風險:線程同時搶最后一塊披薩(資源競爭) 職場類比: **奶茶店有3個員工(3個線程): 收銀員(線程A):負責下單 制作員(
    發(fā)表于 03-26 09:27

    請問如何在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