摘要:對于任務(wù)數(shù)量不端增加的程序,固定線程數(shù)量的線程池是必要的。方法二使用模塊主線程結(jié)束主線程結(jié)束方法三使用模塊參考分組線程池
標(biāo)簽: python奇淫技巧
Ncpu=CPU的數(shù)量
Ucpu=目標(biāo)CPU使用率
W/C=等待時間與計算時間的比率
為保持處理器達(dá)到期望的使用率,最優(yōu)的線程池的大小等于
$$Nthreads=Ncpu*Ucpu*(1+W/C$$
cpu密集型任務(wù),即$W< 如果希望CPU利用率為100%,則$Nthreads=Ncpu$ IO密集型任務(wù),即系統(tǒng)大部分時間在跟I/O交互,而這個時間線程不會占用CPU來處理,即在這個時間范圍內(nèi),可以由其他線程來使用CPU,因而可以多配置一些線程。 混合型任務(wù),二者都占有一定的時間 對于任務(wù)數(shù)量不斷增加的程序,每有一個任務(wù)就生成一個線程,最終會導(dǎo)致線程數(shù)量的失控。對于任務(wù)數(shù)量不端增加的程序,固定線程數(shù)量的線程池是必要的。 threadpool是一個比較老的模塊了,支持py2 和 py3 。 參考:https://pypi.org/project/vthr...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模塊
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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42784.html
摘要:我們以請求網(wǎng)絡(luò)服務(wù)為例,來實際測試一下加入多線程之后的效果。所以,執(zhí)行密集型操作時,多線程是有用的,對于密集型操作,則每次只能使用一個線程。說到這里,對于密集型,可以使用多線程或者多進(jìn)程來提高效率。 為了提高系統(tǒng)密集型運算的效率,我們常常會使用到多個進(jìn)程或者是多個線程,python中的Threading包實現(xiàn)了線程,multiprocessing 包則實現(xiàn)了多進(jìn)程。而在3.2版本的py...
摘要:本文重點掌握異步編程的相關(guān)概念了解期物的概念意義和使用方法了解中的阻塞型函數(shù)釋放的特點。一異步編程相關(guān)概念阻塞程序未得到所需計算資源時被掛起的狀態(tài)。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點: 1、掌握異步編程的相關(guān)概念;2、了解期物future的概念、意義和使用方法;3、了解Python...
摘要:進(jìn)程可創(chuàng)建多個線程來執(zhí)行同一程序的不同部分。就緒等待線程調(diào)度。運行線程正常運行阻塞暫停運行,解除阻塞后進(jìn)入狀態(tài)重新等待調(diào)度。消亡線程方法執(zhí)行完畢返回或者異常終止。多線程多的情況下,依次執(zhí)行各線程的方法,前頭一個結(jié)束了才能執(zhí)行后面一個。 淺談Python多線程 作者簡介: 姓名:黃志成(小黃)博客: 博客 線程 一.什么是線程? 操作系統(tǒng)原理相關(guān)的書,基本都會提到一句很經(jīng)典的話: 進(jìn)程...
摘要:進(jìn)程線程和協(xié)程進(jìn)程的定義進(jìn)程,是計算機中已運行程序的實體。協(xié)程和線程的關(guān)系協(xié)程是在語言層面實現(xiàn)對線程的調(diào)度,避免了內(nèi)核級別的上下文消耗。和都引入了消息調(diào)度系統(tǒng)模型,來避免鎖的影響和進(jìn)程線程開銷大的問題。 進(jìn)程、線程和協(xié)程 進(jìn)程的定義: 進(jìn)程,是計算機中已運行程序的實體。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序的真正運行實例。 線程的定義: 操作系統(tǒng)能夠進(jìn)行運算調(diào)度的最小單...
摘要:在一個進(jìn)程內(nèi)部,要同時干多件事,就需要同時運行多個子任務(wù),我們把進(jìn)程內(nèi)的這些子任務(wù)稱為線程。總結(jié)一下,多任務(wù)的實現(xiàn)方式有三種多進(jìn)程模式多線程模式多進(jìn)程多線程模式線程是最小的執(zhí)行單元,而進(jìn)程由至少一個線程組成。 進(jìn)程與線程 很多同學(xué)都聽說過,現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務(wù)的操作系統(tǒng)。 什么叫多任務(wù)呢?簡單地說,就是操作系統(tǒng)可以同時...
閱讀 2825·2021-11-19 11:35
閱讀 2587·2021-11-02 14:40
閱讀 1403·2021-09-04 16:48
閱讀 3013·2019-08-30 15:55
閱讀 1766·2019-08-30 13:11
閱讀 1961·2019-08-29 11:12
閱讀 1092·2019-08-27 10:52
閱讀 3162·2019-08-26 18:36