成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

3種方式實(shí)現(xiàn)python多線程并發(fā)處理

Godtoy / 1733人閱讀

摘要:對(duì)于任務(wù)數(shù)量不端增加的程序,固定線程數(shù)量的線程池是必要的。方法二使用模塊主線程結(jié)束主線程結(jié)束方法三使用模塊參考分組線程池

標(biāo)簽: python奇淫技巧


最優(yōu)線程數(shù)

Ncpu=CPU的數(shù)量

Ucpu=目標(biāo)CPU使用率

W/C=等待時(shí)間與計(jì)算時(shí)間的比率

為保持處理器達(dá)到期望的使用率,最優(yōu)的線程池的大小等于
$$Nthreads=Ncpu*Ucpu*(1+W/C$$

cpu密集型任務(wù),即$W<

如果希望CPU利用率為100%,則$Nthreads=Ncpu$

IO密集型任務(wù),即系統(tǒng)大部分時(shí)間在跟I/O交互,而這個(gè)時(shí)間線程不會(huì)占用CPU來(lái)處理,即在這個(gè)時(shí)間范圍內(nèi),可以由其他線程來(lái)使用CPU,因而可以多配置一些線程。

混合型任務(wù),二者都占有一定的時(shí)間

線城池

對(duì)于任務(wù)數(shù)量不斷增加的程序,每有一個(gè)任務(wù)就生成一個(gè)線程,最終會(huì)導(dǎo)致線程數(shù)量的失控。對(duì)于任務(wù)數(shù)量不端增加的程序,固定線程數(shù)量的線程池是必要的。

方法一:使用threadpool模塊

threadpool是一個(gè)比較老的模塊了,支持py2 和 py3 。

import threadpool
import time

def sayhello (a):
    print("hello: "+a)
    time.sleep(2)

def main():
    global result
    seed=["a","b","c"]
    start=time.time()
    task_pool=threadpool.ThreadPool(5)
    requests=threadpool.makeRequests(sayhello,seed)
    for req in requests:
        task_pool.putRequest(req)
    task_pool.wait()
    end=time.time()
    time_m = end-start
    print("time: "+str(time_m))
    start1=time.time()
    for each in seed:
        sayhello(each)
    end1=time.time()
    print("time1: "+str(end1-start1))

if __name__ == "__main__":
    main(
方法二:使用concurrent.futures模塊
from concurrent.futures import ThreadPoolExecutor
import time

import time
from concurrent.futures import ThreadPoolExecutor, wait, as_completed

ll = []
def sayhello(a):
    print("hello: "+a)
    ll.append(a)
    time.sleep(0.8)

def main():
    seed=["a","b","c","e","f","g","h"]
    start1=time.time()
    for each in seed:
        sayhello(each)
    end1=time.time()
    print("time1: "+str(end1-start1))
    start2=time.time()
    with ThreadPoolExecutor(2) as executor:
        for each in seed:
            executor.submit(sayhello,each)
    end2=time.time()
    print("time2: "+str(end2-start2))

def main2():
    seed = ["a", "b", "c", "e", "f", "g", "h"]
    executor = ThreadPoolExecutor(max_workers=10)
    f_list = []
    for each in seed:
        future = executor.submit(sayhello, each)
        f_list.append(future)
    wait(f_list)
    print(ll)
    print("主線程結(jié)束")


def main3():
    seed = ["a", "b", "c", "e", "f", "g", "h"]
    with ThreadPoolExecutor(max_workers=2) as executor:
        f_list = []
        for each in seed:
            future = executor.submit(sayhello, each)
            f_list.append(future)
        wait(f_list,return_when="ALL_COMPLETED")
        print(ll)
        print("主線程結(jié)束")

if __name__ == "__main__":
    main3()
方法三:使用vthread模塊

參考:https://pypi.org/project/vthr...

demo1
import vthread
 
@vthread.pool(6)
def some(a,b,c):
    import time;time.sleep(1)
    print(a+b+c)
 
for i in range(10):
    some(i,i,i)
demo2:分組線程池
import vthread
pool_1 = vthread.pool(5,gqueue=1) # open a threadpool with 5 threads named 1
pool_2 = vthread.pool(2,gqueue=2) # open a threadpool with 2 threads named 2

@pool_1
def foolfunc1(num):
    time.sleep(1)
    print(f"foolstring1, test3 foolnumb1:{num}")

@pool_2
def foolfunc2(num):
    time.sleep(1)
    print(f"foolstring2, test3 foolnumb2:{num}")

@pool_2
def foolfunc3(num):
    time.sleep(1)
    print(f"foolstring3, test3 foolnumb3:{num}")

for i in range(10): foolfunc1(i)
for i in range(4): foolfunc2(i)
for i in range(2): foolfunc3(i)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42784.html

相關(guān)文章

  • 對(duì)python并發(fā)編程的思考

    摘要:我們以請(qǐng)求網(wǎng)絡(luò)服務(wù)為例,來(lái)實(shí)際測(cè)試一下加入多線程之后的效果。所以,執(zhí)行密集型操作時(shí),多線程是有用的,對(duì)于密集型操作,則每次只能使用一個(gè)線程。說(shuō)到這里,對(duì)于密集型,可以使用多線程或者多進(jìn)程來(lái)提高效率。 為了提高系統(tǒng)密集型運(yùn)算的效率,我們常常會(huì)使用到多個(gè)進(jìn)程或者是多個(gè)線程,python中的Threading包實(shí)現(xiàn)了線程,multiprocessing 包則實(shí)現(xiàn)了多進(jìn)程。而在3.2版本的py...

    sshe 評(píng)論0 收藏0
  • Python基礎(chǔ)之使用期物處理并發(fā)

    摘要:本文重點(diǎn)掌握異步編程的相關(guān)概念了解期物的概念意義和使用方法了解中的阻塞型函數(shù)釋放的特點(diǎn)。一異步編程相關(guān)概念阻塞程序未得到所需計(jì)算資源時(shí)被掛起的狀態(tài)。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握異步編程的相關(guān)概念;2、了解期物future的概念、意義和使用方法;3、了解Python...

    asoren 評(píng)論0 收藏0
  • 淺談Python線程

    摘要:進(jìn)程可創(chuàng)建多個(gè)線程來(lái)執(zhí)行同一程序的不同部分。就緒等待線程調(diào)度。運(yùn)行線程正常運(yùn)行阻塞暫停運(yùn)行,解除阻塞后進(jìn)入狀態(tài)重新等待調(diào)度。消亡線程方法執(zhí)行完畢返回或者異常終止。多線程多的情況下,依次執(zhí)行各線程的方法,前頭一個(gè)結(jié)束了才能執(zhí)行后面一個(gè)。 淺談Python多線程 作者簡(jiǎn)介: 姓名:黃志成(小黃)博客: 博客 線程 一.什么是線程? 操作系統(tǒng)原理相關(guān)的書,基本都會(huì)提到一句很經(jīng)典的話: 進(jìn)程...

    zsirfs 評(píng)論0 收藏0
  • python協(xié)程與golang協(xié)程的區(qū)別

    摘要:進(jìn)程線程和協(xié)程進(jìn)程的定義進(jìn)程,是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體。協(xié)程和線程的關(guān)系協(xié)程是在語(yǔ)言層面實(shí)現(xiàn)對(duì)線程的調(diào)度,避免了內(nèi)核級(jí)別的上下文消耗。和都引入了消息調(diào)度系統(tǒng)模型,來(lái)避免鎖的影響和進(jìn)程線程開銷大的問(wèn)題。 進(jìn)程、線程和協(xié)程 進(jìn)程的定義: 進(jìn)程,是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序的真正運(yùn)行實(shí)例。 線程的定義: 操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單...

    csRyan 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----進(jìn)程、線程進(jìn)程

    摘要:在一個(gè)進(jìn)程內(nèi)部,要同時(shí)干多件事,就需要同時(shí)運(yùn)行多個(gè)子任務(wù),我們把進(jìn)程內(nèi)的這些子任務(wù)稱為線程??偨Y(jié)一下,多任務(wù)的實(shí)現(xiàn)方式有三種多進(jìn)程模式多線程模式多進(jìn)程多線程模式線程是最小的執(zhí)行單元,而進(jìn)程由至少一個(gè)線程組成。 進(jìn)程與線程 很多同學(xué)都聽說(shuō)過(guò),現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務(wù)的操作系統(tǒng)。 什么叫多任務(wù)呢?簡(jiǎn)單地說(shuō),就是操作系統(tǒng)可以同時(shí)...

    taowen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<