伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

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

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

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

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

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-16 16:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

Python3中,創(chuàng)建線程池是通過concurrent.futures函數(shù)庫中的ThreadPoolExecutor類來實(shí)現(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)建一個(gè)最大容納數(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)

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

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)造實(shí)例,同時(shí)傳入 max_workers 參數(shù)來設(shè)置線程池中最多能同時(shí)運(yùn)行的線程數(shù)目。

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

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

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

2. 自定義線程池

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

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

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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2845

    瀏覽量

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

    關(guān)注

    3

    文章

    4419

    瀏覽量

    67737
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4880

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    使用PYTHON進(jìn)行的跨平臺仿真

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

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

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

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

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

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

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

    有多少種方法可以進(jìn)行頻響曲線測量?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    TaskPool和Worker的對比分析

    askPool(任務(wù))和Worker的作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,用于處理耗時(shí)的計(jì)算任務(wù)或其他密集型任務(wù)。可以有效地避免這些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗
    發(fā)表于 06-18 06:43

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

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

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

    /simulink環(huán)境下,分別用這兩種方法臺電機(jī)串聯(lián)系統(tǒng)的運(yùn)行特性進(jìn)行仿真研究。當(dāng)其中一臺電機(jī)轉(zhuǎn)速、負(fù)載變化時(shí),分析兩種方法下另外一臺電機(jī)獨(dú)立運(yùn)行的情況,臉證分析這兩種方法的可行性
    發(fā)表于 06-10 13:09