国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

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

python爬蟲(chóng)知識(shí)分享 ? 來(lái)源:python爬蟲(chóng)知識(shí)分享 ? 作者:python爬蟲(chóng)知識(shí)分享 ? 2022-03-16 16:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

Python3中,創(chuàng)建線程池是通過(guò)concurrent.futures函數(shù)庫(kù)中的ThreadPoolExecutor類(lèi)來(lái)實(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)行代碼,從輸出可以看出,前面我們?cè)O(shè)置線程池最大線程數(shù),會(huì)保證“同時(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
....

示例完畢,來(lái)說(shuō)明一下:

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

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

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

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

2. 自定義線程池

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

這里我們就使用queue來(lái)實(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2837

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67501
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    的示例代碼,創(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)線速度)和和被測(cè)卷的轉(zhuǎn)動(dòng)角速度求得;另一種是根據(jù)被測(cè)卷的轉(zhuǎn)動(dòng)圈數(shù)和測(cè)長(zhǎng)
    的頭像 發(fā)表于 11-14 16:54 ?2076次閱讀
    用PLC實(shí)現(xiàn)卷徑計(jì)算的<b class='flag-5'>兩種</b>算法

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

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

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

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

    線程問(wèn)題,線程已經(jīng)創(chuàng)建成功了,為什么線程調(diào)用的函數(shù)不會(huì)運(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開(kāi)起來(lái),使用動(dòng)態(tài)創(chuàng)建創(chuàng)建
    發(fā)表于 09-19 06:28

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

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

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

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

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

    有沒(méi)有大佬,可以說(shuō)一下為什么靜態(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

    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開(kāi)起來(lái),使用動(dòng)態(tài)創(chuàng)建創(chuàng)建
    發(fā)表于 06-11 06:36

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

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

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

    保存寄存器和棧指針(就像你下班時(shí)關(guān)燈、鎖門(mén)) 死鎖風(fēng)險(xiǎn):個(gè)線程同時(shí)搶最后一塊披薩(資源競(jìng)爭(zhēng)) 職場(chǎng)類(lèi)比: **奶茶店有3個(gè)員工(3個(gè)線程): 收銀員(線程A):負(fù)責(zé)下單 制作員(
    發(fā)表于 03-26 09:27

    請(qǐng)問(wèn)如何在Python中實(shí)現(xiàn)多線程與多進(jìn)程的協(xié)作?

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

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

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