日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day33-进程池和线程池

發(fā)布時間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day33-进程池和线程池 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

進程池與線程池

開進程開線程都需要消耗資源,只不過兩者比較的情況線程消耗的資源比較少

在計算機能夠承受范圍之內最大限度的利用計算機


什么是池?

# 在保證計算機硬件安全的情況下最大限度的利用計算機 池其實是降低了程序的運行效率 但是保證了計算機硬件的安全 (硬件的發(fā)展跟不上軟件的速度)

?

線程池進程池

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os# pool = ThreadPoolExecutor(5) # 括號內可以傳參數(shù)指定線程池內的線程個數(shù) # # 也可以不傳 不傳默認是當前所在計算機的cpu個數(shù)乘5 pool = ProcessPoolExecutor() # 默認是當前計算機cpu的個數(shù) """ 池子中創(chuàng)建的進程/線程創(chuàng)建一次就不會再創(chuàng)建了 至始至終用的都是最初的那幾個 這樣的話節(jié)省了反復開辟進程/線程的資源 """def task(n):print(n,os.getpid()) # 查看當前進程號time.sleep(2)return n**2def call_back(n):print('拿到了異步提交任務的返回結果:',n.result()) """ 提交任務的方式同步:提交任務之后 原地等待任務的返回結果 期間不做任何事異步:提交任務之后 不等待任務的返回結果(異步的結果怎么拿???) 直接執(zhí)行下一行代碼 """# pool.submit(task,1) # 朝線程池中提交任務 異步提交 # print('主') """ 異步回調機制:當異步提交的任務有返回結果之后,會自動觸發(fā)回調函數(shù)的執(zhí)行""" if __name__ == '__main__':t_list = []for i in range(20):res = pool.submit(task,i).add_done_callback(call_back) # 提交任務的時候 綁定一個回調函數(shù) 一旦該任務有結果 立刻執(zhí)行對于的回調函數(shù)# print(res.result()) # 原地等待任務的返回結果 t_list.append(res)# pool.shutdown() # 關閉池子 等待池子中所有的任務執(zhí)行完畢之后 才會往下運行代碼# for p in t_list:# print('>>>:',p.result())

?

協(xié)程

#串行執(zhí)行 0.8540799617767334 # import time # # def func1(): # for i in range(10000000): # i+1 # # def func2(): # for i in range(10000000): # i+1 # # start = time.time() # func1() # func2() # stop = time.time() # print(stop - start)#基于yield并發(fā)執(zhí)行 1.3952205181121826 # import time # def func1(): # while True: # 10000000+1 # yield # # def func2(): # g=func1() # for i in range(10000000): # time.sleep(100) # 模擬IO,yield并不會捕捉到并自動切換 # i+1 # next(g) # # start=time.time() # func2() # stop=time.time() # print(stop-start)""" 需要找到一個能夠識別IO的一個工具gevent模塊 """ from gevent import monkey;monkey.patch_all() # 由于該模塊經(jīng)常被使用 所以建議寫成一行 from gevent import spawn import time """ 注意gevent模塊沒辦法自動識別time.sleep等io情況 需要你手動再配置一個參數(shù) """def heng():print("")time.sleep(2)print('')def ha():print('')time.sleep(3)print('')def heiheihei():print('嘿嘿嘿')time.sleep(5)print('嘿嘿嘿')start = time.time() g1 = spawn(heng) g2 = spawn(ha) # spawn會檢測所有的任務 g3 = spawn(heiheihei) g1.join() g2.join() g3.join() # heng() # ha() print(time.time() - start)

進程:資源單位
線程:執(zhí)行單位
協(xié)程:單線程下實現(xiàn)并發(fā)

并發(fā)
切換+保存狀態(tài)
ps:看起來像同時執(zhí)行的 就可以稱之為并發(fā)

協(xié)程:完全是程序員自己意淫出來的名詞
單線程下實現(xiàn)并發(fā)
TCP單線程實現(xiàn)并發(fā)

服務端

from gevent import monkey;monkey.patch_all() import socket from gevent import spawnserver = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5)def talk(conn):while True:try:data = conn.recv(1024)if len(data) == 0:breakprint(data.decode('utf-8'))conn.send(data.upper())except ConnectionResetError as e:print(e)breakconn.close()def server1():while True:conn, addr = server.accept()spawn(talk,conn)if __name__ == '__main__':g1 = spawn(server1)g1.join()

?

客戶端

import socket from threading import Thread,current_threaddef client():client = socket.socket()client.connect(('127.0.0.1',8080))n = 0while True:data = '%s %s'%(current_thread().name,n)client.send(data.encode('utf-8'))res = client.recv(1024)print(res.decode('utf-8'))n += 1for i in range(400):t = Thread(target=client)t.start()

?


并發(fā)的條件?
多道技術
空間上的復用
時間上的復用
切換+保存狀態(tài)

程序員自己通過代碼自己檢測程序中的IO
一旦遇到IO自己通過代碼切換
給操作系統(tǒng)的感覺是你這個線程沒有任何的IO
ps:欺騙操作系統(tǒng) 讓它誤認為你這個程序一直沒有IO
從而保證程序在運行態(tài)和就緒態(tài)來回切換
提升代碼的運行效率


切換+保存狀態(tài)就一定能夠提升效率嗎???
當你的任務是iO密集型的情況下 提升效率
如果你的任務是計算密集型的 降低效率


yield 保存上一次的結果


多進程下開多線程
多線程下再開協(xié)程


IO模型(了解)

轉載于:https://www.cnblogs.com/Ryan-Yuan/p/11357850.html

總結

以上是生活随笔為你收集整理的day33-进程池和线程池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。