pool內的程序數預設是cpu核數,假設為4(檢視方法os.cpu_count())開啟6個客戶端,會發現2個客戶端處於等待狀態
在每個程序內檢視pid,會發現pid使用為4個,即多個客戶端公用4個程序
tcp_server.py
#-*- coding: utf-8 -*-
import
osfrom socket import *
from multiprocessing import
pool
deftalk(conn):
while 1: #
迴圈通訊
try:
from_client_msg = conn.recv(1024)
ifnot from_client_msg:break
print("
程序(%s)來自客戶端的訊息:%s
" %(os.getpid(), from_client_msg))
conn.send(from_client_msg.upper())
except
:
break
conn.close()
if__name__ == '
__main__':
server =socket()
ip_port = ("
127.0.0.1
", 8001)
server.bind(ip_port)
server.listen(5)
pool = pool(4) # 建立程序池,程序池內,最多可執行4個程序
while 1: #
迴圈連線
conn, addr =server.accept()
pool.close() # 程序池不再接收新任務
pool.join() # 程序池內的程序都執行完了
server.close()
#程序(5536)來自客戶端的訊息:b'aa'
#程序(4440)來自客戶端的訊息:b'bb'
#程序(3268)來自客戶端的訊息:b'cc'
#程序(4876)來自客戶端的訊息:b'dd'
#程序(5536)來自客戶端的訊息:b'ee'
#程序(4440)來自客戶端的訊息:b'ff'
tcp_client.py
#-*- coding: utf-8 -*-
from socket import *client =socket()
ip_port = ("
127.0.0.1
", 8001)
client.connect(ip_port)
while 1: #
迴圈通訊
inp = input("
>>:
").strip()
ifnot inp: continue
if inp.upper() == "
q": break
client.send(inp.encode())
from_server_msg = client.recv(1024)
print("
來自服務端的訊息:
", from_server_msg)
client.close()
#>>:cc
#來自服務端的訊息: b'cc'
#>>:
發現:併發開啟多個客戶端,服務端同一時間只有4個不同的pid,只能結束乙個客戶端,另外乙個客戶端才會進來.
python3 程序池Pool 詳解
當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool時,可以指定乙個最大程序數,當有新的請求提交到pool中...
python3 程序池的同步呼叫
coding utf 8 import osimport time from multiprocessing import pool deffunc n print s s os.getpid n return n 2 deffunc2 n print s s os.getpid n time.sl...
Python3 執行緒池問題
執行緒池 一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務。這避免了在處理短時間任務時建立與銷毀執行緒的代價。執行緒池不僅能夠保證核心的充分利用,還能防止過分排程。可用執行緒數量應該取決於可用的併發處理器 ...