day33-进程池和线程池
進程池與線程池
開進程開線程都需要消耗資源,只不過兩者比較的情況線程消耗的資源比較少
在計算機能夠承受范圍之內最大限度的利用計算機
什么是池?
?
線程池進程池
?
協(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-进程池和线程池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java总结:Spring5框架(1)
- 下一篇: JUnit-4.12报java.lang