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